리눅스는 머신 한 대에 여러 사용자가 동시 로그인하여 사용하는 것을 전제로 만들어졌다.
그렇기에 감추고 싶은 내 파일을 다른 사용자가 함부로 읽거나, 혹은 다른 사용자의 파일을 실수로 덮어쓰는 일이 있어서는 안된다. 따라서 리눅스에는 접근 권한이라는 개념이 존재한다.
리눅스의 모든 파일에는 소유자가 있다. 직접 작성한 메모부터 시스템에서 제공하는 라이브러리와 명령어에 이르기까지 모든 파일에는 소유자가 존재한다. 파일의 소유자
는 해당 파일에 대한 접근 권한을 자유롭게 설정할 수 있다.
ls -l
옵션을 지정하면 파일의 소유자 확인이 가능하다.
첫 번째 root
는 해당 파일의 소유자를 의미하며, 두 번째 root
는 해당 파일의 소유 그룹을 의미한다. 즉, /bin/cat
이란 파일의 소유자는 root
이며 root
그룹이 소유하고 있음을 알 수 있다.
새롭게 파일을 작성하면 그 파일을 작성한 사용자가 파일의 소유자가 된다.
새로운 디렉터리와 파일을 만든 소유자가 사용자인 dongmin
임을 알 수 있다.
그룹이란 사용자들을 묶은 그룹을 말한다. 예를 들어 시스템 관리를 수행하는 wheel
이라는 그룹을 만든 뒤 여러 사용자를 해당 그룹에 소속시키면 좀 더 쉽게 여러 사용자의 권한을 관리할 수 있다.
한 사용자는 여러 그룹에 소속될 수 있으며, 사용자를 처음 만들 때 특별히 소속될 그룹을 지정하지 않으면 사용자 이름과 동일한 그룹에 소속된다. 현재 본인이 어떤 그룹에 소속되어 있는지 확인하려면 groups
라는 명령어를 사용한다.
리눅스의 각 파일에는 '누구에게 어떤 권한을 허가할지'에 대한 정보가 설정되어 있다.
이를 퍼미션(permission)이라 한다.
파일의 퍼미션도 소유자를 확인할 때와 마찬가지로 ls -l
옵션을 지정하여 확인 가능하다.
-
는 파일 타입을 의미하며, -
는 일반 파일, d
는 디렉터리, l
은 심볼릭 링크를 의미한다.rwxr-xr-x.
는 파일 모드(퍼미션)을 의미하며, 이 9글자는 3글자씩 각각 소유자
, 소유 그룹
, 그 외의 사용자에 대한 퍼미션
을 나타낸다.
r
: 읽기(read)
w
: 쓰기(write)
x
: 실행(execute)
r, w, x라는 글자가 표시된다면 해당 권한이 있음을 의미하고, 권한이 없으면 -이 표시된다.
그렇다면 위의 /bin/cat
파일에 설정된 권한은 다음과 같다.
소유자 : 읽기:O, 쓰기:O, 실행:O
root 그룹에 소속된 사용자 : 읽기:O, 쓰기:X, 실행:O
기타 사용자 : 읽기:O, 쓰기:X, 실행:O
소유자
만 쓰기(write)가 허용되기 때문에, 수정할 수 있는 권한은 소유자에게만 있다.
/etc/crontab
도 확인해보자.
소유자 : 읽기:O, 쓰기:O, 실행:X
root 그룹에 소속된 사용자 : 읽기:O, 쓰기:X, 실행:X
기타 사용자 : 읽기:O, 쓰기:X, 실행:X
이 파일은 사용자(소유자)
인 root
에게만 쓰기(write) 권한이 있기 때문에 다른 사용자 뿐만 아니라 소속된 사용자라도 수정할 수 없다.
그리고 어떤 사용자에게도 실행 권한이 없으므로 직접 실행할 수 없다.
파일과 마찬가지로 디렉터리에도 퍼미션 설정을 할 수 있다. 디렉터리에 설정된 퍼미션을 확인하기 위해서는 ls -l
에서 디렉터리의 정보를 표시하는 -d
옵션을 추가 지정한다.
디렉터리의 퍼미션도 파일과 마찬가지로 r, w, x 문자로 표시되는데, 각각이 의미하는 바가 파일과 다르다는 것을 알아야 한다.
r
: 읽기 : 디렉터리에 포함된 파일 리스트 취득 가능
w
: 쓰기 : 디렉터리 하위에 파일 및 디렉터리 작성 및 삭제 가능
x
: 실행 : 디렉터리로 이동 가능
디렉터리에 대한 읽기 권한이 있으면 해당 디렉터리에 있는 파일의 목록 확인이 가능하다.
디렉터리에 대한 쓰기 권한이 있으면 해당 디렉터리 밑에 파일을 만들거나 지울 수 있다.
(파일을 지울 수 있는지의 여부가 파일에 있는게 아니라 디렉터리의 이 퍼미션에 의해 결정된다는 것이 포인트)
디렉터리에 대한 실행 권한이 있으면 cd
명령어로 해당 디렉터리로 이동하거나 디렉터리 안에 있는 파일을 읽고 쓸 수 있다.
다른 사용자가 볼 수 있게 하려면 보통 rwxr-xr-x
라는 퍼미션을 설정한다.
소유자
는 모든 권한을 가지며, 다른 사용자
들은 cd
명령어로 이동하여 파일을 읽을 수도 있다. 하지만 다른 사용자
뿐만 아니라 그룹에 소속된 사용자
라도 파일을 만들거나 지울 수는 없다.
위에서 확인한 파일과 디렉터리의 퍼미션을 설정하려면 chmod
라는 명령어를 사용하면 된다.
방법은 두 가지인데, 기호를 사용하는 기호 모드와 수치를 사용하는 수치 모드가 있다.
다만 파일 모드의 변경은 해당 파일의 소유자
혹은 슈퍼 사용자
만 가능하다.
(누구나 변경 가능하다면 애초에 퍼미션이라는 존재가 필요없기 때문)
양식 : chmod [ugoa] [+-=] [rwx] <파일 이름>
활용 : chmod u+w file.txt
먼저, ugoa
는 어떤 사용자에게 퍼미션을 부여할지를 의미한다.
이때 특별히 사용자를 지정하지 않으면 모두(a
)를 지정한 것으로 간주한다.
u
: 소유자
g
: 소유 그룹
o
: 기타 사용자
a
: ugo 모두
그리고 +, -, =
는 퍼미션을 허용할 것인지 금지할 것인지를 의미한다.
+
: 퍼미션을 추가함
-
: 퍼미션을 금지함
=
: 지정한 퍼미션과 같게 함
소유 그룹과 그 외 사용자의 퍼미션을 한꺼번에 설정하는 것도 가능하다.
chmod go=r file.txt
는 =
기호를 사용하여 소유 그룹
과 그 외 사용자
가 오직 해당 파일을 읽을 수만 있도록 변경한다.
그러면 원래 퍼미션이 rwxrwxrwx
였다면 rwxr--r--
로 바뀌게 된다.
지금까지 소개한 기호 모드는 상대적인 퍼미션 지정 방법이다. 즉, 지정한 퍼미션 이외에는 변하지 않는다. 따라서 선택적으로 퍼미션을 변경하고 싶을 때 사용한다.
양식 : chmod <8진수의 수치> <파일 이름>
활용 : chmod 755 file.txt
수치 모드는 기존 퍼미션을 새로운 퍼미션으로 덮어쓴다.
수치 모드에서는 rwx
각 퍼미션 문자에 해당하는 숫자를 더해서 퍼미션을 지정한다.
r
: 4
w
: 2
x
: 1
그리고 그렇게 구한 숫자를 각 소유자
, 소유 그룹
, 그 외 사용자
에게 지정할 숫자를 나열한다.
예를 들어 rwxr-xr-x
라는 권한은 755의 숫자가 된다.
해석하면 소유자
는 읽기 쓰기 실행이 다 가능하고 소유 그룹
및 그 외 사용자
는 읽기 실행만 가능하다.
644는 rw-r--r--
소유자
는 읽기 쓰기가 가능하고 소유 그룹
및 그 외 사용자
는 읽기만 가능하다. 다른 사용자가 봐도 되는 일반 파일에는 보통 이 퍼미션을 설정한다.
리눅스에는 관리자 권한을 가지는 특별한 사용자인 슈퍼 사용자가 있다.
슈퍼 사용자는 root
라는 사용자 이름을 가져서 루트 사용자
라고도 부른다.
반대로 슈퍼 사용자가 아닌 사용자를 일반 사용자
라고 부른다.
슈퍼 사용자는 강력한 권한을 가지고 있어 시스템 설정 파일을 바꾸거나 새로운 애플리케이션을 설치할 수 있다. 그리고 파일에 설정된 퍼미션을 무시하고 모든 파일을 읽고 수정하고 삭제할 수 있다.
이는 다른 말로 슈퍼 사용자라면 위험한 명령어도 제한 없이 실행할 수 있음을 의미한다.
일반 사용자라면 실수로 중요한 시스템 파일을 지우는 것이 애초에 불가능하지만, 슈퍼 사용자라면 이것이 가능하다. 따라서 반드시 필요한 상황에서만 슈퍼 사용자로 조작하는 것이 좋다.
일반 사용자에서 슈퍼 사용자로 전환하는 su
와 sudo
명령어에 대해 알아보자.
일시적으로 다른 사용자로 전환할 수 있다. 즉, 로그아웃하지 않고 다른 사용자가 될 수 있다.
su
명령어로 다른 사용자로 전환할 수도 있지만 주로는 슈퍼 사용자로 전환하기 위해 사용한다.
sudo passwd root
로 슈퍼 사용자 암호 설정.
프롬프트가 $에서 #으로 바뀌었다.
su
명령어로 슈퍼 사용자로 전환. 일반 사용자로 돌아갈 때는 exit
여기서 주의해야 할 점은 su
명령어를 통해 슈퍼 사용자가 되었을 때에는 환경 변수나 현재 디렉터리는 일반 사용자의 상태가 유지된다. 슈퍼 사용자의 환경으로 초기화하고 싶다면 su -
이렇게 하이픈(-)을 추가하여 실행한다.
일반 사용자의 환경을 유지한 채 슈퍼 사용자로 작업하다 보면 일부 애플리케이션이 정상적으로 동작하지 않을 수 있으니 이 점을 유의하자.
이 명령어를 사용하면 다른 사용자가 되어 명령어를 실행할 수 있다.
사용자를 지정하지 않으면 슈퍼 사용자로 명령어를 실행한다.
주로는 일반 사용자로 로그인한 뒤 슈퍼 사용자로만 실행할 수 있는 명령어를 실행하기 위해 사용한다.
퍼미션(권한)이 없어 실행되지 않던 명령어가 sudo
명령어를 통해 실행되었다.
슈퍼 사용자로 해당 명령어가 실행된 것인데, sudo
와 su
는 비슷해 보이지만
sudo
는 한 명령어만 슈퍼 사용자로 실행하기 위한 명령어이다.
따라서 지정한 명령어가 끝나면 일반 사용자로 다시 돌아온다.
반면에 su
명령어로 슈퍼 사용자로 전환하면 exit
를 하기 전까지는 슈퍼 사용자인 채로 있게 된다.
그리고 sudo
를 실행할 때 입력하는 암호는 su
를 실행할 때 입력하는 슈퍼 사용자의 암호가 아니라 현재 로그인한 사용자의 암호이다.
모든 사용자가 sudo
명령어를 사용할 수 없으므로 리눅스에서는 어떤 사용자가 sudo
명령어를 사용할 수 있는지 설정할 수 있다.
특정 사용자에게 sudo
명령어를 허용하는 방법을 알아보자.
sudo
명령어를 사용할 수 있는 사용자의 목록은 /etc/sudoers
라는 파일을 통해 관리된다.
su -
로 이동 후 파일로 들어가본다.
sudoers
파일의 각 항목은 <사용자> <머신 이름>=(<권한>)<명령어>
와 같은 형식을 따른다.
<사용자>
에는 일반 사용자 이름 혹은 %<그룹 이름>
을 지정한다.
일반적으로 설치 직후에는 %admin ALL=(ALL) ALL 로 설정되어 있다.
이 설정의 의미는 admin 그룹에 속한 사용자는 모든 머신에서 모든 명령어를 실행할 수 있음을 의미한다. 배포판에 따라서는 admin이나 sudo라는 이름으로 사용된다.
특정 사용자에게 sudo
의 권한을 부여하려면 슈퍼 사용자가 /etc/sudoers
파일에 다음과 같이 기재하면 된다.
dongmin ALL=(ALL) ALL
학습용 환경에서는 위와 같은 권한을 주어도 되지만, 실무 환경에서는 충분히 주의를 기울여야 한다. 이는 슈퍼 사용자의 권한을 주는 것이기 때문.
/etc/sudoers
파일을 직접 텍스트 에디터로 편집하는 것은 위험하다. 혹여 오타라도 발생하면 누구도 sudo
를 사용할 수 없게 되기 때문이다.
이에 따라 이 파일을 안전하게 편집하기 위한 visudo
라는 특별한 명령어를 사용한다.
이 명령어 실행을 위해서는 슈퍼 사용자 권한이 필요하므로 su
혹은 sudo
를 사용하여 실행한다.
sudo visudo
기본으로 Vim
이 기동하는데, 내용을 편집한 뒤 종료하면 변경 사항이 반영된다.
나의 사용자를 입력하여 sudo
권한을 부여해보자.
(설치 과정에서 만들었던 나의 사용자는 처음부터 sudo
권한이 부여되어 sudo
명령어를 실행할 수 있었음. 일부 배포판은 처음부터 설치 과정에서 부여해준다고 함.)
나의 사용자에서 sudo
권한이 실행되지 않을 때 대처 방법 ↴
수정된 파일 저장하기 전
파일명 끝 .tmp 지우기
이후 해당 계정으로 이동하여 sudo 명령어를 실행하면 정상적으로 수행됨.
su
인 경우 exit
를 하기 전까지 슈퍼 사용자인 채로 있고 sudo
는 한 명령어만 슈퍼 사용자 권한으로 실행한다는 차이점을 기억할 것이다.
슈퍼 사용자의 권한을 사용하는 것은 최소한으로 제어하는 것이 좋다.
그렇기에 이에 부합하는 명령어는 sudo
이며, 슈퍼 사용자의 권한으로 실행할 수 있는 명령어를 사용자별로 제한할 수도 있기에 sudo
가 많이 사용되는 추세이다.
일부 배포판에서는 설치 과정에서 만든 사용자에게 처음부터 sudo
권한을 부여하기도 한다.
터미널 멀티플렉서 tmux
리눅스를 다루다 보면 여러 개의 셸을 동시에 조작하고 싶은 경우가 생긴다.
이때 터미널을 여러 개 기동하는 것도 한 가지 방법이지만, 터미널 멀티플렉서라는 애플리케이션으로 효율적으로 작업할 수 있다.
한 단말에서 여러 개의 가상 단말을 다룰 수 있게 해주는 애플리케이션이며
아래와 같이 설치 후 tmux를 입력 후 실행한다.
평소처럼 조작하다가 새로운 셸을 띄우고 싶다면Ctrl
+b
를 누르고c
를 입력한다.
Ctrl
+b
입력 후n
: 다음 창 전환
Ctrl
+b
입력 후p
: 이전 창 전환
Ctrl
+b
입력 후&
/exit
: 창 닫기
사용을 원하면 더 알아보면 되겠다.