리눅스는 다중 사용자 시스템입니다. 1대의 리눅스에 여러 명의 사용자가 동시 접속해서 사용 가능하다는 뜻입니다.
기본적으로는 root라는 슈퍼 유저가 있습니다. root 유저는 모든 작업을 실행할 수 있는 권한을 갖고 있고, 시스템에 접속할 수 있는 사용자를 생성할 수 있는 권한도 있습니다.
리눅스의 모든 사용자는 혼자 존재할 수 없으며, 하나 이상의 그룹에 소속되어야 합니다.
사용자 확인
/etc/passwd 파일에는 리눅스 시스템에 등록되어 있는 모든 사용자 정보가 UserName:Password:UID:GID:FullName:HomeDir:DefaultShell 형식으로 기록되어 있습니다.
1refo in /Users/refo at rocky
2➜ cat /etc/passwd
3root:x:0:0:root:/root:/bin/bash
4bin:x:1:1:bin:/bin:/sbin/nologin
5daemon:x:2:2:daemon:/sbin:/sbin/nologin
6# ...
7systemd-oom:x:994:994:systemd Userspace OOM Killer:/:/usr/sbin/nologin
8refo:x:501:501::/home/refo:/bin/zsh
이 중 systemd-oom까지는 리눅스에 기본으로 존재하는 표준 사용자이고, 아래부터 추가된 사용자 정보입니다. 제 경우에는 제 유저 이름인 refo가 추가되어 있습니다.
유저의 비밀번호는 x로 표시되어 있는데, /etc/shadow 파일에서 확인할 수 있습니다…만 암호회되어 알아볼 수는 없습니다.
1refo in ~ at rocky took 4.8s
2➜ tail -3 /etc/shadow
3tail: cannot open '/etc/shadow' for reading: Permission denied
4
5refo in ~ at rocky
6➜ sudo tail -3 /etc/shadow
7tss:!!:19737::::::
8systemd-oom:!*:19737::::::
9refo:$6$TPizjeFQ894~~~VvomswF3X.:19749:0:99999:7:::
그룹 확인
사용자 정보와 비슷하게 그룹 정보도 /etc/group 파일에 기록되어 있습니다. 형식은 GroupName:GroupPassword:GID:UserNamesInThisGroup 순서입니다.
1refo in /Users/refo at rocky
2➜ cat /etc/group
3root:x:0:
4bin:x:1:
5daemon:x:2:
6# ...
7systemd-oom:x:994:
8refo:x:501:
이 파일도 systemd-oom까지는 리눅스에 기본으로 존재하는 표준 그룹이고, 아래부터 추가된 그룹 정보입니다. 제 경우에는 유저 이름과 동일한 refo가 그룹에도 추가되어 있습니다.
사용자와 그룹 관련 주요 명령
useradd또는adduser: 새 사용자를 추가하는 명령입니다.-g GroupName: 사용자를 생성하면서 명시된 그룹에 추가합니다. 기본 값은 위에서 봤던 것처럼 사용자 이름과 동일한 그룹을 새로 생성합니다.-d Path: 사용자 홈 경로로, 기본은/home/${USER}입니다.-s Shell: 기본 쉘은 보통은bash일테니/bin/bash로 되어 있을 것입니다.
1refo in ~ at rocky 2➜ useradd -g root -d /testhome -s /bin/zsh testuser1 3 4refo in ~ at rocky 5➜ cat /etc/passwd 6# ... 7refo:x:501:501::/home/refo:/bin/zsh 8testuser1:x:1000:0::/testhome:/bin/zsh # root 그룹이어서 GID = 0passwd: 유저 비밀번호를 지정합니다.1refo in ~ at rocky 2➜ sudo passwd testuser1 3Changing password for user testuser1. 4New password: # 비밀번호 입력은 화면에 안 보이므로 오타를 조심합니다. 5BAD PASSWORD: The password is shorter than 8 characters 6# 1234 같은 간단한 비밀번호 입력하면 경고합니다. 7Retype new password: 8passwd: all authentication tokens updated successfully.생성한
testuser1로 로그인합니다.1refo in ~ at rocky took 23.3s 2➜ su testuser1 3Password: 4[testuser1@rocky]/home/refo% cd 5[testuser1@rocky]~% pwd 6/testhome # 유저 생성 시 -d 옵션으로 바꿔준 홈 경로가 표시됩니다. 7[testuser1@rocky]~%
파일, 디렉터리 소유와 허가권
리눅스에서는 현재 디렉토리에 있는 파일과 디렉토리 목록을 볼 때 ls 명령어를 사용합니다. 이 때 -l 옵션을 사용하면 자세한 정보를 포함하여 목록을 볼 수 있습니다. 추가로 보이는 정보는 아래와 같습니다.
1refo in ~ at rocky
2➜ ls -lh
3total 0
4-rw-r--r-- 1 testuser1 root 0 Jan 27 16:55 sample
-rw-r--r--: 파일 유형 + 허가권- 파일 유형
- 디렉터리인 경우
d, 일반 파일인 경우-, 장치를 의미하는b,c, 링크l등으로 표기됩니다.
- 디렉터리인 경우
- 파일 허가권
- 3자리씩 끊어서 r(read, 읽기 권한), w(write, 쓰기 권한), x(execute, 실행 권한)를 나타냅니다.
- 첫번째는 파일 소유자의 권한, 두 번째는 그룹의 권한, 세 번째는 그 외 사용자의 권한입니다.
- 숫자로
0644와 같이 표기하기도 합니다.
- 파일 유형
1: 링크 수testuser1: 파일 소유자 이름root: 파일 소유 그룹 이름0: 파일 크기(Byte). 이 파일은touch로 생성한 빈 파일이라 0바이트로 나옵니다.Jan ...: 마지막 변경 시각- 파일 이름
실습
파일을 생성하고 권한을 확인해 봅니다.
1refo in ~ at rocky 2➜ echo "date" > test.sh 3 4refo in ~ at rocky 5➜ ls -lh 6total 4.0K 7-rw-r--r-- 1 refo refo 5 Jan 27 17:05 test.sh실행 권한이 없는 파일은 실행할 수 없습니다.
1refo in ~ at rocky 2➜ ./test.sh 3zsh: permission denied: ./test.sh현재 유저에게만 실행 권한을 주고 실행해 봅시다.
1refo in ~ at rocky 2➜ chmod 744 ./test.sh 3 4refo in ~ at rocky 5➜ ls -lh 6total 4.0K 7-rwxr--r-- 1 refo refo 5 Jan 27 17:05 test.sh 8 9refo in ~ at rocky 10➜ ./test.sh 11Sat Jan 27 05:08:25 PM KST 2024root유저, 그룹으로 바꿔보고 실행해 봅시다.refo유저는 다른 그룹에 속하므로 실행 불가할 것입니다.1refo in ~ at rocky 2➜ sudo chown root:root test.sh 3 4refo in ~ at rocky … 5➜ ./test.sh 6zsh: permission denied: ./test.sh+x로 실행 권한을 주면 소유자, 그룹, 그 외 유저 모두 실행 가능한 권한이 추가되어 실행 가능합니다.1refo in ~ at rocky 2➜ sudo chmod +x ./test.sh 3 4refo in ~ at rocky 5➜ ls -lh 6total 4.0K 7-rwxr-xr-x 1 root root 5 Jan 27 17:05 test.sh 8 9refo in ~ at rocky 10➜ ./test.sh 11Sat Jan 27 05:09:00 PM KST 2024
링크
- 우리가 일반적으로 생각하는 바로가기 링크는 리눅스에서는 Symbolic Link로 만들 수 있습니다.
ln -s target linkname명령으로 생성 가능합니다. - 다른 링크 종류로는 Hard Link가 있습니다.
1refo in ~ at rocky
2➜ ls -lh
3total 4.0K
4-rwxr-xr-x 1 refo refo 5 Jan 27 17:05 test.sh
5
6refo in ~ at rocky
7➜ ln test.sh hardlink
8
9refo in ~ at rocky
10➜ ln -s test.sh softlink
11
12refo in ~ at rocky
13➜ ls -ilh
14total 12K
152293071 -rwxr-xr-x 2 refo refo 5 Jan 27 17:05 hardlink
162300505 lrwxrwxrwx 1 refo refo 7 Jan 27 17:15 softlink -> test.sh
172293071 -rwxr-xr-x 2 refo refo 5 Jan 27 17:05 test.sh
18
19refo in ~ at rocky
20➜ cat hardlink
21date
22
23refo in ~ at rocky
24➜ cat softlink
25date
하드 링크와 소프트 링크의 가장 큰 차이점은 실제 파일과의 관계입니다. 하드 링크는 같은 원본 파일을 가리킵니다. ls 시 크기도 동일하게 나오고 inode 번호도 동일합니다. 그리고 파일 위치가 변경되어도 동작합니다.
심볼릭 링크는 파일 포인터이므로 크기가 실제 파일과 다를 수 있습니다. 그리고 실제 타겟의 경로가
->뒤에 나옴. 이 경로에 파일이 없으면 링크가 깨집니다.1refo in ~ at rocky 2➜ mv ./test.sh /tmp 3 4refo in ~ at rocky 5➜ ls -ilh 6total 8.0K 72293071 -rwxr-xr-x 1 refo refo 5 Jan 27 17:05 hardlink 82300505 lrwxrwxrwx 1 refo refo 7 Jan 27 17:15 softlink -> test.sh 9 10refo in ~ at rocky 11➜ ./hardlink 12Sat Jan 27 05:18:50 PM KST 2024 13 14refo in ~ at rocky 15➜ ./softlink 16zsh: no such file or directory: ./softlink대상 파일이 다시 원래 경로에 위치한다면 심볼릭 링크도 다시 정상 동작합니다.
1refo in ~ at rocky 2➜ mv /tmp/test.sh . 3 4refo in ~ at rocky 5➜ ls -ilh 6total 12K 72293071 -rwxr-xr-x 1 refo refo 5 Jan 27 17:05 hardlink 82300505 lrwxrwxrwx 1 refo refo 7 Jan 27 17:15 softlink -> test.sh 92300512 -rwxr-xr-x 1 refo refo 5 Jan 27 17:05 test.sh 10 11refo in ~ at rocky 12➜ ./hardlink 13Sat Jan 27 05:19:16 PM KST 2024 14 15refo in ~ at rocky 16➜ ./softlink 17Sat Jan 27 05:19:18 PM KST 2024
Prerequisites: 이 글에서 언급되었으나 깊게 설명하지 않은 내용입니다.
- linux
Comments