Linux는 여러 사람이 한 컴퓨터를 같이 쓰는 것을 전제로 만들어졌다. 클러스터가 바로 그런 곳이다. 그래서 파일마다 누가 읽고, 고치고, 실행할 수 있는지가 정해져 있다. 권한 때문에 막히는 일은 대개 두 가지다. 직접 만든 스크립트가 Permission denied로 실행되지 않거나, ssh 키 권한이 너무 열려 있어 접속이 거부되는 경우다.

ls -l 읽기

$ ls -l
total 56
-rw-r--r-- 1 kim kim    62 Sep 29 00:10 get-energy.sh
drwxr-xr-x 2 kim kim  4096 Sep 29 00:10 scripts
-rw-r--r-- 1 kim kim 48678 Sep 29 00:10 water.out
열예뜻
1-rw-r--r--종류(첫 글자)와 권한(나머지 9글자)
21하드 링크 수. 신경 쓰지 않아도 된다.
3kim소유자
4kim그룹
548678크기(바이트). ls -lh면 48K처럼 나온다.
6Sep 29 00:10마지막 수정 시각
7water.out이름

첫 글자가 -면 일반 파일, d면 디렉터리, l이면 심볼릭 링크(다른 파일을 가리키는 바로 가기)다.

rwx와 사용자, 그룹, 기타

권한 9글자는 세 글자씩 끊어 읽는다.

-  rwx  r-x  r-x
│   │    │    └─ o (other): 그 밖의 모든 사용자
│   │    └────── g (group): 파일의 그룹에 속한 사용자
│   └─────────── u (user):  소유자
└─────────────── 종류
글자파일에서디렉터리에서
r내용 읽기안의 파일 목록 보기 (ls)
w내용 고치기안에 파일 만들기, 지우기, 이름 바꾸기
x프로그램으로 실행안으로 들어가기 (cd)
-해당 권한 없음

-rw-r--r--는 소유자만 고칠 수 있고 다른 사람은 읽기만 된다는 뜻이다. 파일을 지울 수 있는지는 파일이 아니라 그 파일이 든 디렉터리의 w 권한이 정한다. 시스템 파일은 읽기조차 막혀 있다.

$ cat /etc/shadow
cat: /etc/shadow: Permission denied

chmod

권한은 chmod(change mode)로 바꾼다. 가장 흔한 경우는 직접 쓴 스크립트에 실행 권한을 주는 것이다. 새로 만든 파일에는 x가 없어서 그대로는 실행되지 않는다.

$ ./get-energy.sh water.out
bash: ./get-energy.sh: Permission denied
$ chmod +x get-energy.sh
$ ls -l get-energy.sh
-rwxr-xr-x 1 kim kim 62 Sep 29 00:10 get-energy.sh
$ ./get-energy.sh water.out
FINAL SINGLE POINT ENERGY       -76.321274411145

./를 붙이는 이유는 05장의 PATH와 관련이 있다. 셸은 현재 디렉터리에서 명령을 찾지 않으므로 경로를 직접 적어야 한다. bash get-energy.sh water.out처럼 bash에 파일을 넘기면 실행 권한 없이도 돈다. 스크립트 자체를 쓰는 법은 셸 가이드 01장에 있다.

문자 표기는 누구(u, g, o, 전부는 a)에게 무엇을 더하거나(+) 빼거나(-) 정확히 지정(=)하는지 적는다.

명령하는 일
chmod +x run.sh모두에게 실행 권한 추가
chmod u+x run.sh소유자에게만 실행 권한 추가
chmod go-r data.out그룹과 기타에게서 읽기 권한 제거
chmod u=rwx,go=rx run.sh정확히 rwxr-xr-x로 설정
chmod -R g+r results/디렉터리 안 전체에 적용

숫자 표기: 755, 644, 600

r=4, w=2, x=1로 놓고 세 자리마다 더하면 숫자 세 개가 된다. 문서나 오류 메시지에서 이 표기를 자주 본다.

숫자문자주로 쓰는 곳
755rwxr-xr-x스크립트, 실행 파일, 디렉터리
644rw-r--r--일반 파일 (입력, 출력, 텍스트)
700rwx------나만 들어갈 디렉터리 (~/.ssh)
600rw-------나만 읽을 파일 (ssh 개인 키)
$ chmod 644 get-energy.sh; ls -l get-energy.sh
-rw-r--r-- 1 kim kim 62 Sep 29 00:10 get-energy.sh
$ chmod 755 get-energy.sh; ls -l get-energy.sh
-rwxr-xr-x 1 kim kim 62 Sep 29 00:10 get-energy.sh

chmod -R 777로 권한 문제를 한 번에 풀라는 글을 인터넷에서 볼 수 있는데, 공용 클러스터에서는 누구나 내 파일을 고치고 지울 수 있게 된다. 쓰지 않는다.

ssh 키가 600이어야 하는 이유

ssh 개인 키는 비밀번호와 같다. ssh는 개인 키를 다른 사람이 읽을 수 있는 상태면 아예 쓰지 않는다. WSL에서 /mnt/c의 키를 복사해 오거나 백업에서 되살렸을 때 자주 생긴다.

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/home/kim/.ssh/id_ed25519' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/home/kim/.ssh/id_ed25519": bad permissions
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/id_ed25519
$ ls -l ~/.ssh
total 8
-rw------- 1 kim kim 399 Sep 29 00:10 id_ed25519
-rw-r--r-- 1 kim kim  92 Sep 29 00:10 id_ed25519.pub

공개 키(.pub)는 남에게 줘도 되는 파일이라 644로 둔다. 키를 만들고 쓰는 법은 06장에서 다룬다.

소유자와 그룹

id나 groups로 내가 속한 그룹을 본다. 클러스터에서는 연구실이나 프로젝트 단위로 그룹을 만들어 공용 디렉터리를 그룹 권한으로 공유하는 경우가 있다. 그룹 이름과 공유 디렉터리 위치는 사이트마다 다르다.

$ id
uid=1000(kim) gid=1000(kim) groups=1000(kim),27(sudo)
$ chgrp mygroup results.csv      # 파일의 그룹 바꾸기 (내가 속한 그룹으로만)
$ chmod g+r results.csv          # 그룹 사람들이 읽을 수 있게

파일 소유자를 바꾸는 chown은 관리자만 쓸 수 있다. 다른 사람에게 파일을 넘기려면 그 사람이 직접 복사해 가게 한다.

sudo와 클러스터

sudo는 명령 하나를 관리자(root) 권한으로 실행한다. 내 노트북이나 WSL에서는 sudo apt install tree처럼 시스템 전체에 프로그램을 설치할 때 쓰고, 처음 설치할 때 정한 비밀번호를 묻는다.

클러스터에는 sudo가 없다

공용 클러스터에서 일반 사용자는 sudo를 쓸 수 없다. 인터넷 설치 안내가 sudo apt install로 시작하더라도 클러스터에서는 통하지 않는다. 대신 이미 설치된 프로그램을 module load로 불러오거나, conda로 홈 디렉터리에 설치하거나, 소스를 받아 홈에 컴파일한다 (09장). 필요한 시스템 라이브러리가 없으면 관리자에게 요청한다.

umask

새 파일의 기본 권한은 umask가 정한다. 값은 기본 권한에서 빼는 비트다. 022면 파일은 644, 디렉터리는 755로 만들어진다. Ubuntu 데스크톱은 002라서 그룹에도 쓰기 권한이 붙은 664, 775가 나온다.

$ umask
0022

클러스터에서 그룹과 파일을 공유할 때 말고는 바꿀 일이 드물다. 바꾸려면 ~/.bashrc에 umask 027처럼 적는다(05장).