루트는 400 권한을 가진 파일에 쓸 수 있지만 사용자는 읽기 전용인 이유는 무엇입니까?

루트는 400 권한을 가진 파일에 쓸 수 있지만 사용자는 읽기 전용인 이유는 무엇입니까?

권한이 없는 사용자로 파일을 생성하고 권한 모드를 로 변경하면 400사용자는 해당 파일을 읽기 전용으로 올바르게 표시합니다.

$ touch somefile
$ chmod 400 somefile
$ [ -w somefile ] && echo rw || echo ro
ro

모두 괜찮습니다.

그러나 루트가 나타납니다.

# [ -w somefile ] && echo rw || echo ro
rw

실수가 있었나요? 물론 루트는 읽기 전용 파일에 쓸 수 있지만 이런 습관을 들이면 안 됩니다. 모범 사례에서는 쓰기 권한 비트를 테스트할 수 있어야 한다고 지시하는 경향이 있으며, 그렇지 않은 경우 이유가 있어서 그렇게 설정됩니다. .

내 생각엔 둘 다 이해하고 싶은 것 같아이런 일이 일어나고 있으며,어떻게내가 하나 얻을 수 있을까?잘못된쓰기 비트가 설정되지 않은 파일을 테스트할 때 반환 코드가 있습니까?

답변1

뭔가 오해하신 것 같아요 -w. 파일에 "쓰기 권한"이 있는지 확인하는 것이 아니라 파일에 쓸 수 있는지 확인합니다.옮기다사용자.

좀 더 구체적으로는 또는 이와 유사하다고 합니다 access(2).

예를 들어, 스크립트가 있는 경우 스크립트를 if [ -w /etc/shadow ]실행하면 strace다음과 유사한 줄이 표시될 수 있습니다.

faccessat(AT_FDCWD, "/etc/shadow", W_OK)

root파일을 쓸 수 있으므로 0이 반환됩니다 .

예를 들어 일반 사용자의 경우:

faccessat(AT_FDCWD, "/etc/shadow", W_OK) = -1 EACCES (Permission denied)

루트 사용자로

faccessat(AT_FDCWD, "/etc/shadow", W_OK) = 0

이는 내 컴퓨터에 라이센스가 있음에도 불구하고 발생합니다 /etc/shadow.000

---------- 1 root root 4599 Jan 29 20:08 /etc/shadow

이제 당신이 하고 싶은 일을 얻었어요흥미로운그렇게 간단하지 않습니다.

단순 권한을 확인하고 싶다면 ls출력을 확인하거나 전화 stat등을 하면 됩니다. 하지만 ACL이 이러한 권한을 재정의할 수 있다는 점에 유의하세요. 파일에 권한 400이 있다고 해서 쓰기가 차단되는 것은 아닙니다.

답변2

test -w일명 [ -w파일 모드를 확인하지 않습니다. 쓰기 가능한지 확인합니다. 루트의 경우 실제로 그렇습니다.

$ help test | grep '\-w'
  -w FILE        True if the file is writable by you.

내가 테스트한 방법은 stat(1)(" %a 8진수 액세스")의 출력에 대해 비트별 비교를 수행하는 것이었습니다.

(( 0$(stat -c %a somefile) & 0200 )) && echo rw || echo ro

의 출력이 8진수로 해석되도록 서브셸에는 접두사가 $(...)필요합니다 .0stat(( ... ))

답변3

루트 사용자는 원하는 것은 무엇이든 할 수 있으며 "일반" 파일 권한에는 제한이 없습니다. 발 타겟 연습을 방지하기 위해 eXecute 권한 없이 일반 파일을 직접 실행하지 않습니다.

관련 정보