Remind Me What do Permissions mean again?
모든 파일과 디렉토리는 9개의 permisiion bit들의 집합과 type field가 있습니다.
- r: 파일을 읽는데 필요한 허가
- w: 파일을 쓰는데 필요한 허가
- x: 파일을 실행하는 데 필요한 허가
chmod 777
chmod | 7 | 7 | 7 |
01 | 111 | 111 | 111 |
d | rwx | rwx | rwx |
1 | 2 | 3 | 4 |
1. 파일의 타입
2. 소유자 permission
3. 그룹 permission
4. 다른 모든 사람들의 permission
mknod는 파일의 타입인 첫 번째 필드를 바꿔줍니다. chmod는 숫자와 파일을 인자로 받아 permission bit를 수정합니다.
파일은 owner를 가집니다. 만약 프로세스가 owner와 같은 user id(또는 루트)를 가진다면 첫 번째의 permission이 적용됩니다. 만약 파일과 같은 그룹이라면 두 번째에 permission bit이 적용됩니다. 그 무엇도 아니라면 마지막 세 번째의 permission bit이 적용됩니다.
How do I change the permissions on a file?
파일의 permission을 바꾸기 위해서는 chmod를 사용합니다.(change the file mode bits의 약자)
system call로는 int chmod(const char* path, mode_t mode);가 존재합니다.
shell command에서는 chmod를 사용하는 두 가지 방법이 존재합니다. 한 가지는 8진수를 사용하는 것이고 또 다른 방법은 문자열을 이용하는 것입니다.
$ chmod 644 file1
$ chmod 755 file2
$ chmod 700 file3
$ chmod ugo-w file4
$ chmod o-rx file4
8진수 문자는 각각의 역할에 따른 permission을 의미합니다. owner, group, everyone else를 각각 의미합니다. 각 자리수는 read(4), write(2), execute(1)의 허가된 합을 의미합니다.
예를 들어 chmod 775 myfile은.
user는 4+2+1로 read/write/execute가 모두 가능하고
group와 everyone else는 4+1로 read/execute만 가능합니다.
How do I read the permission string from ls?
ls에서 permission을 확인하려면 -l옵션을 사용합니다. permission은 drwxrwxrwx의 형태로 출력됩니다. 가장 처음의 문자는 파일 타입을 의미합니다. 첫 번째 문자로 가능한 값은 아래와 같습니다.
- (-) regular file
- (d) directory
- (c) character device file
- (l) symbolic link
- (p) pipe
- (b) block device
- (s) socket
What is sudo?
sudo를 사용하면 machine의 admin이 될 수 있습니다. sudo는 일시적으로 root로 명령을 실행할 때 사용할 수 있습니다.
$ sudo mount /dev/sda2 /stuff/mydisk
$ sudo adduser fred
How do I change ownership of a file?
chown username filename을 사용해 파일의 ownership을 바꿀 수 있습니다.
How do I set permissions from code?
chmod(const char*path, mode_t mode);
를 사용해 바꿀 수 있습니다.
What are some files 'setuid'? What does this mean?
set-user-ID-on-execution bit은 파일이 동작할 때 관련된 프로세스의 유저를 바꿉니다. 일반적으로 root로 명령을 실행될 필요가 있지만 sudo를 통해 root가 아닌 사용자가 실행할 때 사용됩니다. 이 예로 sudo가 있습니다.
set-group-ID-on-execution은 프로세스가 동작중인 group를 바꿔줍니다.
Why are they useful?
가장 일반적인 사용예로는 프로그램의 동작 중에 root access가 필요한 경우입니다.
What permissions does sudo run as?
$ ls -l /usr/bin/sudo
-r-s--x--x 1 root wheel 327920 Oct 24 09:04 /usr/bin/sudo
's' 비트는 execute and set-uid를 의미합니다. 프로세스의 유효한 userid는 부모 프로세스와 다릅니다. 이 예에서는 root가 될 것입니다.
What's the different between getuid() and geteuid()?
- getuid는 실제 userid를 반환합니다(root로 로그인했으면 0)
- geteuid는 effictive userid를 반환합니다(root처럼 행동한다면 0. 즉 setuid flag로 root로 바뀌었을 때도 0)
How do I ensure only privileged user can run my code?
geteuid()를 호출해서 user의 effective permission을 확인합니다. 반환값이 0이라면 프로그램이 root로서 유효하게 동작하고 있음을 나타냅니다.
'Angrave System Programming > File Systems' 카테고리의 다른 글
File System: Files are inodes (0) | 2019.05.08 |
---|---|
File System: Introduction (0) | 2019.05.02 |