권한이 없는 사용자로 파일을 생성하고 권한 모드를 로 변경하면 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진수로 해석되도록 서브셸에는 접두사가 $(...)
필요합니다 .0
stat
(( ... ))
답변3
루트 사용자는 원하는 것은 무엇이든 할 수 있으며 "일반" 파일 권한에는 제한이 없습니다. 발 타겟 연습을 방지하기 위해 eXecute 권한 없이 일반 파일을 직접 실행하지 않습니다.