Information Security Study
240112 리눅스 파일시스템(파일 권한/소유권 변경, cat, less, cp, mv, ln, 하드링크와 심볼릭링크) 본문
240112 리눅스 파일시스템(파일 권한/소유권 변경, cat, less, cp, mv, ln, 하드링크와 심볼릭링크)
gayeon_ 2024. 1. 12. 15:54파일 권한 변경하기
리눅스를 이용해 뭔가를 하다보면 Permission denied를 접하게 된다.
리눅스에서 파일이나 디렉터리와 관련된 권한들은
한 사용자가 다른 사용자의 개인파일에 접근하지 못하게 하거나
중요한 시스템 파일들을 함부로 제어하지 못하게 막기 위한 목적으로 고안되었다.
-rwxrwxrwx
위와 같은 형식으로 권한을 10자리 비트로 보게 되는데
첫 자리가 -인 경우 일반 파일, d인 경우 디렉터리, l(소문자L)은 심볼릭 링크,
b는 블록장치, c는 문자장치, s는 소켓, p는 이름 있는 파이프 등을 나타낸다.
10자리 중 첫 글자를 제외한 나머지는 3글자씩 구별할 수 있다.
r은 읽기(4), w는 쓰기(2), x는 실행(1) 권한을 나타낸다.
각 알파벳별 숫자는 해당 권한이 있는지를 나타내며 0~7까지 부여했을 때
1, 2, 4 세 숫자의 합의 경우의 수가 겹치지 않고 0~7을 구분할 수 있다는 것을 이용해
실제로는 숫자로 권한을 제어하는 경우가 많다.
3비트씩 쪼갠 뒤쪽 9비트의 의미는
첫 3비트는 소유자의 권한, 다음 3비트는 그룹의 권한,
마지막 3비트는 다른 사용자 및 그룹의 권한이다.
$ chmod 숫자(3자리) 파일명
: 특정 파일의 권한을 바꿀 수 있다.
date.txt의 권한을 변경해 보겠다.
chmod로 date.txt에 최대 권한을 주었다.
소유자, 그룹, 다른 사용자 모두 date.txt는 읽기, 쓰기, 실행하기가 가능하다.
예를들어 $ chmod 400 파일명 이라면
해당 파일의 권한을 -r-- --- --- (소유자만 읽을(4) 수 있음)으로 처리한다.
$ chmod -R 숫자(3자리) 디렉터리및경로
: 디렉터리 전체에 대한 권한 변경
또한 특정 파일 하나가 아닌 디렉터리 전체에 대해서 해당 작업을 수행하려면
-r 태그를 추가해주면 된다.
이 경우 해당 디렉터리 + 하위 파일이나 디렉터리 전체에 권한 변경을 유발한다.
파일 소유권 변경하기
일반 사용자는 파일, 디렉터리의 소유권을 다른 사용자에게 변경해 줄 수 없다.
소유권 변경이 가능한 사용자는 루트 계정뿐이다.
$ su -
: 루트계정으로 변경
sudo su로도 변경 가능하다.
root 계정으로 접속 후 hello world가 적힌 rootuser 텍스트 파일을 생성했다.
ls -l로 파일, 디렉토리 목록을 확인하니 rootuser.txt의 소유주와 그룹명이 root임을 확인할 수 있다.
위 명령어를 입력하면 rootuser.txt를 수정할 수 있다.
수정 및 저장이 가능한지 확인해 보겠다.
키보드 입력이 가능하지만
ecs -> :wq 입력으로 저장하려 하면
readonly 옵션이 되어있기 때문에 저장이 불가능하다는 에러문구가 뜬다.
위 화면에서 빠져나오기 위해서는 :q!로 강제종료해야 한다.
이는 수정을 시도한 계정은 ubuntu이고 그룹도 root와 다르기에 다른 사용자 및 그룹에 속한다.
따라서 읽기 권한만 가능해 해당 파일에 대해 쓰기, 실행이 불가능한 것이다.
# chown 유저명 파일명
: 소유주가 적힌 유저명으로 변경
단 이 경우는 유저명만 변경되고 소유그룹은 변경되지 않는다.
소유주가 root에서 ubuntu로 변경되었다.
* 참고
소유주가 root가 아니어도 root 계정은 당연히 수정 및 저장이 가능하다.
chown 명령어로 소유주를 ubuntu로 변경했기 때문에 수정 및 저장이 가능해졌다.
# chown 유저명:그룹명 파일명
: 유저명과 그룹명을 같이 변경
또한 chown 명령도 디렉터리에 적용가능하다.
# chown -R 유저명:(그룹명) 파일명
: -R을 사용해서 하위목록까지 한번에 바꿀 수 있다.
cat으로 파일 내용물 출력하기
$ cat 옵션 파일이름
: 파일 내용을 콘솔에 찍을 수 있다.
echo가 단순히 다음에 오는 구문을 콘솔에 찍었다면 cat은 해당 파일이 저장한 내용을 보여준다.
$ cat /etc/hostname
: 실제로 hostname이 출력된다.
$ cat 파일1 파일2…
: 두 개 이상의 파일을 출력할 수 있다.
$ cat -n 파일
: 행 번호를 출력한다.
내용 왼쪽에 행 번호가 출력된 모습을 확인할 수 있다.
less 명령어를 활용한 스크롤 출력하기
$ less 옵션 파일명
: cat처럼 한번에 모든 내용을 보여주는게 아니라 스크롤할 수 있도록 만들어서 보여준다.
$ less /etc/bash.bashrc
혹은
$ less /etc/bashrc
: 긴 파일을 스크롤로 출력하는 예시를 볼 수 있다.
입력한 파일의 내용만 스크롤로 확인할 수 있다.
* less 명령어로 진입한 창 내부에서 사용할 수 있는 단축키
- 스페이스바, f, 컨트롤+v → 한 화면 아래로 스크롤하기
- b, 알트+v → 한 화면 위로 스크롤하기
- j, 컨트롤+n, 엔터 → 한 행 아래로 스크롤하기
- k, 컨트롤+p →한 행 위로 스크롤하기
- q → less 명령어 종료하기
cp명령어를 활용해 파일 디렉터리 복사하기
cp는 copy의 약자로 파일과 디렉터리를 복사한다.
$ cp 옵션 복사할파일 … 복사할 위치
$ cp hello.txt world.txt
: hello.txt를 복사해서 world.txt를 만드는 명령어다.
date.txt를 datecp.txt 이름으로 복사해서 저장했다.
내용도 역시 동일하게 복사되었다.
또한 복사된 위치를 특정 디렉터리로 할 수도 있다.
$ cp hello.txt dir1
: hello.txt를 dir1이라는 폴더 내에 복사한다.
dir1 폴더에 rootuser.txt를 복사한 후 ls로 목록을 확인하면
현재 경로에 복사한 것이 아니기 때문에 보이지 않는다.
ls dir1으로 dir1의 파일, 디렉토리 목록을 출력하니 rootuser.txt가 있는 것을 볼 수 있었다.
2개이상의 파일은 아래와 같이 한다.
$ cp hello.txt world.txt linux.txt dir1
: hello.txt, world.txt, linux.txt를 dir1 내부로 복사한다.
cp명령어는 같은 이름의 파일이 존재하는데 해당 이름으로 복사를 수행하면 덮어쓴다.
이때 -i 옵션을 사용하면 덮어쓰기 전 경고를 띄울 수 있다.
그리고 디렉터리와 마찬가지로 디렉터리 복사시에는
$ cp -r dir1 dir2
위와 같이 지정해야 dir2 하위에 dir1을 복사해서 집어넣을 수 있다.
dir2의 파일, 디렉토리 목록을 확인하면 rootuser.txt도 복사된 것을 확인할 수 있다.
* 참고
copy가 아닌 yank로 복사하는 경우도 있다.
mv명령어로 파일 옮기기
mv는 move의 약자다.
$ mv 옵션 이동할파일 … 목적지
: 파일을 이동할 수 있다.
파일 이름을 바꾸는데 사용할 수도 있다.
$ mv file1 file2
: file1의 내용을 그대로 간직한 file2라는 파일이 생기고 file1은 소멸된다.
기본적으로 파일명을 2개 주는게 아니라 파일명 - 폴더명 순으로 입력해야 의도한 이동이 이뤄진다.
catman.txt가 없어지고 catman2.txt가 생겼다.
$ mv file1 dir1
: file1을 dir1내부로 이동시킨다.
catman2.txt가 rootuser.txt가 있는 dir1으로 이동했다.
기존 경로에서 catman2.txt가 사라진 모습을 확인할 수 있다.
$ mv file1 file2 file3 dir1
: 여러 파일을 한 번에 옮긴다.
가장 마지막에 들어오는 파라미터가 폴더경로이므로 이전에 나열된 모든 파일은 다 해당 타겟으로 옮겨진다.
-i 옵션도 사용할 수 있다.
다만 디렉토리 이동의 경우는 -r을 주지 않아도 된다.
$ mv dir1 dir2
: dir1을 dir2 하위 디렉토리로 이동
-r 옵션 없이 dir1이 dir2의 하위 디렉토리로 이동한 모습을 확인할 수 있다.
ln 명령어로 링크 만들기
링크
: 리눅스 파일에 별명을 붙이는 것
별명을 붙이면 원래 파일명으로도 해당 파일을 호출할 수 있으나, 별명으로도 호출하는것이 가능해진다.
$ ln 옵션 링크할파일 링크이름
링크는 하드 링크, 심볼릭 링크로 두 종류가 있다.
하드 링크
하드 링크
: 한 파일에 이름을 여러 개 부여하는 것
하드 링크를 매칭한 경우는 모두가 원래 파일의 이름이었던 것처럼 사용된다.
$ cp /etc/crontab file1
: 크론탭을 현재 경로의 file1으로 복사한다.
$ ln file1 file2
: file1에 file2라는 별명을 붙인다.
$ cat file2
: file2를 열겠다 == file1을 열겠다.
하드 링크 파일은 삭제 시 rm 명령어로 특정 별명을 지정해 삭제할 수 있는데 해당 별명만 삭제되고
나머지 하드링크는 계속 역할을 수행할 수 있다.
* 복사와의 차이점
1. 링크
file1에 iiiiiiii라는 글을 추가하고
file2의 내용을 읽어보면
file2에도 반영이 되어있다.
2. 복사
file1을 복사해 file3를 만들고 file3를 수정한다.
hello를 추가하고 file3를 읽어보면 당연히 반영이 되어있지만
file1은 반영되지 않았다.
= 링크는 원본과 복사본이 동기화되어있지만, 복사는 그렇지 않다!
심볼릭 링크
디렉터리는 하드 링크로 지정할 수 없고, 하드 링크는 서로 다른 디스크에 걸쳐서 만드는게 불가능하다.
이런 제약이 없기 때문에 심볼릭 링크가 필요한 경우가 있다.
하드 링크는 원본, 복사본이 동기화되어있어 모두 원본처럼 작동하고
심볼릭 링크는 복사본이 원본으로 이동하는 레퍼런스 역할을 하여 바로가기와 같은 기능을 한다.
따라서 원본이 삭제되면 하드 링크는 정상적으로 기능할 수 있지만 심볼릭 링크는 사용 불가능하게 된다.
심볼릭 링크는 하드 링크 문법에 -s 옵션을 추가로 붙여서 만든다.
$ cp /etc/crontab file1
$ ln -s file1 file2
심볼릭 링크는 ls-l을 이용해 조회할 수 있다.
링크가 어떻게 연결된 상황인지 보여준다.
심볼릭 링크는 마치 참조형 변수처럼 해당 파일의 위치만 가지고 있기 때문에
원본이 삭제되면 기능하지 못한다.
링크가 깨진 심볼릭 링크는 사용할 수 없다.
링크를 사용하는 이유
긴 절대경로를 별명으로 줄여서 사용하기 위해 사용하거나
혹은 버전이 여러 개인 파일이 한 폴더에 있을 때 구분하기 위해 별명을 붙이는 식으로 사용한다.