일반적으로 root 유저로 계정을 전환할 때 우리는

$ su -

명령을 사용하게 된다.

그런데, 

$ sudo -i

라는 명령을 사용해도 동일하게 root 유저가 되는데 어떤 차이가 있는건지 궁금해졌다.

 

1. sudo -i 의 동작

sudo -i 에서 "-i" 옵션은 대화형 모드 + root 계정의 *로그인 쉘 실행을 의미한다.(interactive mode + root login shell)

이때, root 계정의 쉘 환경과 환경변수를 모두 적용한다. sudo는 (당연하게도)사용자가 현재 sudo 권한을 가질 때만 작동한다.

sudo 명령 자체가 단일 명령어를 root 권한으로 실행하는 것이기 때문에, 현재 로그인 쉘(세션)은 유지된다.

sudo -i 는 실제로 root 계정의 로그인 쉘을 실행하며, 환경변수 $HOME, $PATH 등을 root 계정의 것으로 설정한다.

 

*로그인 쉘: 로그인 쉘은 사용자가 로그인할 때 실행되는 쉘로, 사용자 계정의 환경 변수($PATH, $HOME 등)와 셸 프로파일(.bash_profile, .bashrc 등)이 로드된다. sudo -i는 root 계정으로 로그인한 것처럼 로그인 쉘을 실행하는 것이다.

2. su - 의 동작

su 는 substitute user 의 약자로, 현재 로그인 쉘을 유지하면서 새로운 유저의 로그인 쉘로 변경하는 것이다. "-" 옵션을 주면 root 계정으로 전환되고, root 계정의 쉘 환경과 환경변수가 모두 적용된다. 

 

3. sudo -i 와 su - 의 차이점

su - 는 root 계정의 비밀번호가 필요하다.

반면, sudo -i 는 자신의 비밀번호가 필요하다. root 계정의 비밀번호는 필요하지 않다. sudo 권한을 통해 root 계정의 환경을 임시로 사용한다고 이해하면 쉽다.

 

즉, sudo 명령어의 -i 옵션은 "interactive login shell" 이라고만 알아도 두가지의 차이점을 이해할 수 있다.

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

file attribute 는 ls -l 명령에서 조회되지 않으며, 파일을 보호하거나 파일을 수정/삭제할 때 추가적인 동작을 설정하기 위한 속성이다.

이해하기 위해, 파일에 대한 자세한 상태를 조회해보자.

# stat file1
  File: file1
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: 89h/137d	Inode: 3028155     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2025-03-15 19:41:19.831013012 +0900
Modify: 2025-03-15 19:41:19.831013012 +0900
Change: 2025-03-15 19:41:19.831013012 +0900
 Birth: -
# cat file1
# stat file1
  File: file1
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: 89h/137d	Inode: 3028155     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2025-03-23 13:36:24.020187004 +0900
Modify: 2025-03-15 19:41:19.831013012 +0900
Change: 2025-03-15 19:41:19.831013012 +0900
 Birth: -

stat 명령어로 파일에 대한 access time, modify time, change time 을 조회할 수 있다. 그런데, cat 명령어로 파일을 조회하면 access time 이 변경되는 것을 볼 수 있다.

  • access time: 파일 내용을 조회한 시점
  • modify time: 파일 내용을 수정한 시점
  • change time: 파일 속성정보를 수정한 시점(소유자, 권한 등)

이 파일에 접근하여도 access time 을 갱신하지 않도록 하려면 어떻게 해야 할까?

해당 파일의 file attribute 에 특정 attribute 를 추가해주면 된다.(여기서는 A 속성이 맞겠다.)

 

file attribute 주요 속성

속성명 의미 자세한 설명
A no atime updates 파일에 access가 발생해도 파일 시스템의 파일 해당 정보의 atime을 갱신하지 않음
a append only 파일에 내용 추가만 할 수 있음. vi 에디터로 파일 마지막에 내용을 붙이는 것도 불가능. append (>>) 하는 형태로만 가능.(파일보안을 위해 일반적으로 사용). 디렉토리에 설정하면 해당 디렉토리 내에 파일을 생성만 할 수 있음
i immutable 파일의 이름, 내용, 소유자, 권한 등 어떠한 것도 변경할 수 없음(삭제도 안됨. 변경되면 안되는 중요한 설정 파일에 사용하면 좋음)
C no copy on write 기록 중 복사 업데이트 안함
c compressed 커널에 의해 파일이 디스크에 자동으로 압축된 상태로 저장함
D synchronous directory updates 디렉토리의 변경사항을 동기화시킴
d no dumps dump 명령어로 백업되지 않음
e extent format 파일이 디스크 블록에 매핑될 때 extent를 사용함
j data journaling 파일에 데이터를 쓰기 전에 ext3 journal에 먼저 씀
S synchronous updates 파일이 변경되면 디스크에 동기적으로 저장됨
s secure deletion 파일이 삭제될 경우 해당 블록이 0이 되고, 디스크에 다시 쓰기가 됨. 삭제파일복구 불가능
T top of directory hierarchy 해당 디렉토리를 최상위 디렉토리로 인식함
t no tail-merging 파일에 partial block fragmentation(tail-merging)이 발생하지 않음. 즉, 파일에 t 속성이 설정되면 tail 명령어로 여러 파일을 병합하여 출력할 때, 해당 파일의 마지막 내용은 출력되지 않습니다.
u undeletable 파일을 삭제시 그 내용이 저장되어 다시 복구할 수 있게 됨(휴지통 같은 느낌?)

 

1. file attribute 확인하기

lsattr {파일명}

 

2. file attribute 변경하기

chattr[ -options] {속성변경자}{속성} {대상파일명}

 

options 설명

옵션 설명
-p 파일의 프로젝트 번호 설정하기
-R 하위 디렉토리까지 재귀적으로 변경
-V 변경한 속성 출력
-f 대부분의 오류 메시지 출력안함
-v {version} 버전 설정하기

 

속성변경자 설명

속성변경지 설명
+ 지정한 속성 추가
- 지정한 속성 제거
= 지정한 속성만 남기고 나머지 속성들은 제거

 

e.g.

# chattr +a file1

=> file1 에 append 만 가능하도록 속성을 설정한다.

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

 

기본적인 권한 이외에도 특수 권한(special permission)이라는 것이 존재한다. 

SetUID, SetGID, Sticky bit 이 있으며, 8진수 권한의 제일 앞자리로 나타낸다.

  symbol 8진수 의미 설명 용도
SetUID user execute 권한 s 2^2 = 4

x+SetUID 프로그램(파일)이 실행되는 동안에 프로그램의 소유자 권한으로 권한이 변경되어 실행됨 프로그램 내에서 특정 유저 권한으로만 수행할 수 있는 액션을 해야 할 때
user execute 권한 S -+SetUID
SetGID group execute 권한 s 2^1 = 2 x+SetGID 프로그램(파일)이 실행되는 동안에 프로그램의 소유 그룹 멤버로 권한이 변경되어 실행됨 프로그램 내에서 특정 그룹 권한으로만 수행할 수 있는 액션을 해야 할 때
group execute 권한 S -+SetGID
Sticky bit other execute 권한 t 2^0 = 1 x+sticky bit 디렉토리 내에 누구나 파일을 생성할 수 있으나, 삭제는 파일 소유자만 가능하도록 함 시스템이나 애플리케이션에서 생성하는 파일을 모아놓는 디렉토리를 보호하고자 할 때
e.g. /tmp

 

1. SetUID 설정방법

symbol 파라미터 형식: chmod u+s {파일명}

8진수 모드 형식: chmod 4{기존권한} {파일명}

e.g.

# chmod u+s program.exe
# chmod 4755 program.exe

 

2. SetUID 제거방법

symbol 파라미터 형식: chmod u-s {파일명}

8진수 모드 형식: chmod 0{기존권한} {파일명}

* special permission 자리를 0으로 세팅하므로, SetUID 이외에도 모든 special permission 을 지워준다.

e.g.

# chmod u-s program.exe
# chmod 0755 program.exe

 

3. SetGID 설정방법

symbol 파라미터 형식: chmod g+s {파일명}

8진수 모드 형식: chmod 2{기존권한} {파일명}

e.g.

# chmod g+s program.exe
# chmod 2755 program.exe

 

4. SetGID 제거방법

symbol 파라미터 형식: chmod g-s {파일명}

8진수 모드 형식: chmod 0{기존권한} {파일명}

* special permission 자리를 0으로 세팅하므로, SetGID 이외에도 모든 special permission 을 지워준다.

e.g.

# chmod g-s program.exe
# chmod 0755 program.exe

 

5. sticky bit 설정방법

symbol 파라미터 형식: chmod o+t {디렉토리명}

8진수 모드 형식: chmod 1{기존권한} {디렉토리명}

* 보통 모든 유저가 파일 생성은 가능하게 하므로, 1777 으로 설정하는 것이 일반적임

e.g.

# chmod o+t tmp
# chmod 1777 tmp

 

6. sticky bit 제거방법

symbol 파라미터 형식: chmod o-t {디렉토리명}

8진수 모드 형식: chmod 0{기존권한} {디렉토리명}

* special permission 자리를 0으로 세팅하므로, sticky bit 이외에도 모든 special permission 을 지워준다.

e.g.

# chmod o-t tmp
# chmod 0777 tmp

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,