[Liunx] File Type & Mode (Permission)

귀찮Lee·2023년 3월 27일
0

Liunx

목록 보기
5/5

◎ st_mode format

  • st_mode : stat 구조체에서 파일 타입과 모드, 허가를 담당하는 부분
  • C 언어에서 <sys/stat.h>의 stat() 함수를 통해 가져온 stat 구조체 중에 st_mode에서 확인할 수 있다.
  • 세가지 부분으로 나누어짐 (total 16 bits)
    • file type (4 bits) : 파일의 종류를 나타냄
    • special bit (3 bits) : 특이 기능들을 나타냄
    • file permission bit (9 bits) : 접근 유저에 따라 읽기/쓰기/실행 권한을 나타냄

◎ File Type

  • Regular File

    • 일반적인 파일, 가장 흔한 종류
    • 파일이 이진수이던 text이던 상관없이 UNIX kernel을 구분하지 않는다.
  • Directory

    • 내부의 파일 이름 & 파일의 pointer로 구성
    • 다른 말로 하자면, 파일명과 파일의 I-node 번호를 매핑하는 리스트로만 구성
  • Block special File

    • 하드디스크, CD/DVD 등의 저장 장치 파일들
    • 시스템의 I/O 버퍼를 사용, 바이트 크기의 블록 단위로 입출력을 수행
    • 불변적인 사이즈의 바이트 크기의 블록 단위로 입출력을 수행
  • Character special file

    • 터미널, 프린터, 키보드 등의 문자 기반 장치 파일
    • 시스템의 I/O 버퍼를 사용하지 않으며 바이트 단위 입출력을 사용
    • 가변적인 사이즈의 바이트 단위 입출력을 사용
  • FIFO (also called pipe)

    • 프로세스간의 communication을 위해 사용함
    • 특정 프로그램의 출력을 중간 파일을 거치지 않고 다른 파일의 입력으로 바로 보내는 파일
  • Socket

    • 프로세스 사이의 네트워크 communication에 사용
    • 네트워크 입출력을 담당하는 API로서 특정 컴퓨터 사이의 정보를 전달하는 통로 역할을 수행
  • Symbolic Link

    • window에서 바로가기 기능과 같음
    • 다른 파일로 가기위한 Point

◎ Special bits

set-user-ID, set-group-ID

  • set-user-ID, set-group-ID

    • set-user-ID : 파일 실행 시, effective user ID를 파일의 소유자로 권한을 설정함
    • set-group-ID : 파일 실행 시, effective group ID를 파일의 소유자로 권한을 설정함
  • real ID vs effective ID

    • real ID : userm, group을 구분하기 위해 사용, password file에 쓰여 있음
    • effective ID : 파일 허가 권한을 결정함
    • 일반적으로 real user(group) ID, effective user(group) ID는 같지만 setuid (setgid)와 같은 설정을 통해 달라질 수 있다.
  • 예시 : /usr/bin/passwd

    • passwd program을 실행하는 도중 root 권한을 부여 받음
      • passwd에 set-user-ID가 설정되어 있고 user는 root로 되어 있음
    • passwd program 실행 중에는 root 권한의 다른 파일들을 파일의 user 접근 권한에 따라 읽기/수정/실행 할 수 있다.

sticky bit

  • 예전의 사용 방법

    • 메모리의 Swap area에 계속 있으라는 뜻으로 사용됨 (빠르게 사용하기 위해)
    • 최근 기술이 발달하면서 굳이 쓸모가 없어짐
  • 최근

    • 다른 사람의 파일을 변경할 수 없다.
    • 폴더에 sticky bit를 설정하면 기본적으로 파일의 소유자가 아니면 해당 디렉토리 내의 파일을 지우거나 수정하지 못하도록 기본적인 umask를 설정한다. (참고 자료)

◎ File Access permission

종류 / 기능

  • user, group, others에 대해 R/W/X의 권한 설정 가능
    • Read
      • file : file data를 읽을 수 있는가? (copy 기능)
      • directory : file list를 읽을 수 있는가? (ls가 가능한가?)
    • Write
      • file : file data를 수정할 수 있는가?
      • directory : file을 생성, 삭제할 수 있는가?
    • Execute
      • file : file을 실행할 수 있는가?
      • directory : 이동할 수 있는가? (cd가 가능한가?)

◎ File Access permission 표기 방법

10자리 문자 표기법

  • 1-3-3-3으로 끊어서 읽음
    • 파일 종류 : (맨 앞) 문자열 한개로 표기
      • : 일반 파일을 의미함
      • "d" : directory를 의미함
      • "b" : block special File, "c" : charater special file, "l" : symbolic link, ...
    • user/group/other의 접근 권한 : 각각 3글자로 표기
      • 각각 순서대로 3글자씩 할당되어 있음
      • 각각의 자리는 r/w/x가 읽기/쓰기/실행 권한을 나타낸다.
    • 명령어 "ls -l"을 통하여 접근 권한을 10자리 문자 표기법으로 확인할 수 있다.

8진수 표기법

  • 3자리의 숫자로 표기
    • 각각의 숫자는 순서대로 user/group/other의 접근 권한을 의미함
    • read : 4, write : 2, execute : 1 이며, 각각의 접근 권한이 있을 때마다 더하여 나타냄
      • ex) 5 : read, execute 권한 있음
    • 명령어 chmod를 통해 간편하게 접근 권한을 부여할 수 있다.

Special bit 표기

  • 10자리 문자 표기법

    • set-user-id : user의 접근 권한 표기 방법 중에 x 대신 s를 써서 표현
      • 소문자 s : set-user-id 권한과 user의 실행 권한이 있음
      • 대문자 S : set-user-id 권한은 있지만, user의 실행 권한이 없음
    • set-group-id : group의 접근 권한 표기 방법 중에 x 대신 s를 써서 표현
      • 소문자 s : group-user-id 권한과 group의 실행 권한이 있음
      • 대문자 S : group-user-id 권한은 있지만, group의 실행 권한이 없음
    • sticky bit : other의 접근 권한 중에 표기 방법 중에 x 대신 t를 써서 표현
      • 소문자 t : sticky bit와 group의 실행 권한이 있음
      • 대문자 T : sticky bit는 있지만, group의 실행 권한이 없음
  • 10자리 표기법 예시

    • -r-s--s-rwx : 일반 파일, 접근 권한 517, set-user-id, set-group-id 설정되어 있음
    • -r-S--S-rwx : 일반 파일, 접근 권한 407, set-user-id, set-group-id 설정되어 있음
  • 8진수 표기법

    • 일반적으로 3자리의 8진수로 표기하는데, 맨 앞의 숫자를 추가하여 표기
    • set-user-id : 4, set-group-id : 2, sticky bit : 1이고 각각을 더하여 표현
  • 8진수 표기법 예시

    • 7755 : set-user-id, set-group-id, sticky bit가 전부 할당되어 있음
    • 0755 : 하나도 할당되어 있지 않음 (접근 권한은 755임)

◎ 참고 자료

stat()

#include <sys/stat.h>

int stat(const char *pathname, struct stat *buf);
int fstat(int filedes, struct stat *buf);
int lstat(const chat *pathname, struct stat *buf);
// return 0 if OK, -1 on error 

Status Structure

  • 구현 환경에 따라 다를 수 있다.
    struct stat {
      mode_t st_mode; /* file type & mode (permissions) */
      ino_t st_ino; /* i-node number (serial number) */
      dev_t st_dev; /* device number (file system) */
      nlink_t st_nlink; /* number of links */
      uid_t st_uid; /* user ID of owner */
      gid_t st_gid; /* group ID of owner */
      off_t st_size; /* size in bytes, for regular files */
      time_t st_atime; /* time of last access */
      time_t st_mtime; /* time of last modification */
      time_t st_ctime; /* time of last file status change */
    };

16 bits 표기

  • 아래 자료는 8진수로 표기되어 있음 (3자리-1자리-3자리로 구분)
    • 앞의 3자리는 파일 타입을 의미
    • 중간 1자리는 special bits를 의미
    • 뒤의 3자리는 접근 권한을 의미

외부 참고 자료

profile
배운 것은 기록하자! / 오류 지적은 언제나 환영!

0개의 댓글