400 개의 권한을 가진 파일이 루트에 의해 쓰기 가능하지만 사용자에 의해 읽기 전용으로 보이는 이유는 무엇입니까?


10

권한이없는 사용자로 파일을 작성하고 권한 모드를로 변경하면 400해당 사용자는 읽기 전용으로 올바르게 볼 수 있습니다.

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

모든 것이 잘됩니다.

그러나 뿌리는 다음과 같습니다.

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

이런 젠장? 물론 루트는 읽기 전용 파일에 쓸 수는 있지만 습관을 들이지 않아야합니다. 모범 사례는 쓰기 권한 비트를 테스트 할 수 있어야한다고 지시하는 경향이 있습니다. 그런 이유로 그런 식으로.

이런 일이 발생 하는지 , 쓰기 비트가 설정되지 않은 파일을 테스트 할 때 잘못된 반환 코드를 얻는 방법 을 이해하고 싶 습니까?


btw RHEL6 ( 4.1.2(1)-release)과 RHEL7 ( 4.2.46(2)-release) 을 모두 사용 하고 있습니다.
리치

16
"Best Practice는 쓰기 권한 비트를 테스트 할 수 있어야한다고 지시하는 경향이 있으며, 그렇지 않은 경우에는 그 이유로 설정되었습니다." -실제로 가장 좋은 방법은 "루트를 실행하지 마십시오"입니다. 루트로 실행중인 경우 이미 권한 확인을 우회하기로 결정했습니다. 사용자 공간에서 해당 권한 확인을 수동으로 다시 구현하는 것은 재난을 위한 레시피입니다 .
Kevin

@Kevin 특권이없는 물건을 실행할 수 있다면 좋습니다. 이것은 /etc/dhcp/dhcpd.conf루트가 소유 한 을 조작하기위한 것 입니다. 공급 업체 제공을 사용하고 dhcpd있습니다. 재앙이야? 파일은 RCS에 체크, 나는의 사용을 자동화하고있어 rcsdiff, ci그리고 co우리가 가지고 있기 때문에 사업자 의 필요에가 ... 작동하는지. (권한 비트 검사 -w등으로 자세히는 test(1)) 그 기초 작업, 실패의 첫 번째 줄 거라고 ci -u잎이 파일은 읽기 전용. 나는 그것을 버리고 똑바로 가고 rcsdiff -q확인하고 $?있습니다. 비참한 dhcpd? 이 소유 한 것 dhcpd입니다.
Rich

1
커널과 사용자 공간에 각각 다른 두 가지 권한 검사 구현이 있기 때문에 잠재적 인 재앙 이 수 있습니다. 더구나, 이러한 구현은 동일한 결과를 생성하기위한 것이 아니기 때문에 서로에 대해 퍼지 테스트를 할 수는 없습니다. 이제 액세스 할 수있는 두 개의 경로가 있으며 서로 독립적으로 잠겨 있어야합니다.
Kevin

@Kevin 물론, 그들은 동일한 결과를 생성하지 않으며 (맨 페이지의 세부 사항이 낮음에도 불구하고) 의도하지 않았지만 명시 적으로 쓰기 권한 비트확인하고 싶습니다 . 그리고 맨 페이지 bashtest그 무엇을 믿고 저를지도 [ -w입니다.
Rich

답변:


26

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

서브 쉘은 접 두부 $(...)가 필요 0하므로의 출력은 stat로 8 진수로 해석됩니다 (( ... )).


간결한 주셔서 감사합니다. 잘 사용 (( ... & ... ))합니다. 한 오타 수정 :-)
Rich

3 ... 없음이 확인 if필요 진수 권한 출력은 %a없습니다 %d, 그리고 (( ... ))A는 접두사 필요 0의 출력 해석하는 stat등의 진수를.
Rich

@Patrick man stat은 "% d 디바이스 번호 10 진수"라고 말하지만 "접근 권한"은 무엇입니까? 0 접두사가 필요하다는 당신의 요점은 잘 만들어졌지만, 우리는 거기에 그것을 붙여야한다고 생각합니다 :).
sourcejedi

2
stat -c 0%a...
sourcejedi

@sourcejedi ack, 당신이 맞아요. 어떤 이유로 나는 % d이 10의 액세스 권한이라고 생각했습니다. 편집 내용을 복원했습니다. 고마워 :-)
패트릭

30

나는 당신이 무엇을 오해했다고 생각합니다 -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이기 때문에 파일 쓰기가 중지되지 않습니다 ...


아니, "오해"맨 페이지의 잘못에 대한 읽기 될 것은 -w: test(1)"파일이 존재하고 : 명시 적입니다 쓰기 권한이 아니라"부여 " 파일이 현재 사용자가 기록 될 수 있습니다 ." 권한 재정의 나 ACL 에 대해서는 아무것도 없습니다 . bash(1)cagey : "파일이 존재하고 쓰기 가능 하면 참 " ksh(1)shenanigans에 대한 미묘한 힌트를줍니다. "-w file // 파일이 있고 현재 프로세스에서 쓸 수있는 경우 True 입니다." zsh(1)연기를하는 test(1), zshmisc(1)로 나가셨되고 ksh(1), 그리고 zshexpn(1)몇 가지 흥미로운 권한을 기반 세부 글 로빙. csh(1)유감스럽게도 간단하다 : "쓰기 권한".

btw : 패트릭의 대답, 1을 받아 들였습니다. 리드 온 질문에 적절하게 대답하지 않았기 때문에 : 쓰기 비트가 설정되지 않은 파일을 테스트 할 때 어떻게 잘못된 반환 코드를 얻을 수 있습니까? 그리고 2. 으르렁 거리는 납입으로 인해 맨 페이지를 오해했습니다.
Rich

3
@Rich이 글을 읽는 동안, 귀하의 의견이 약간 혼란 스러울 것이라고 생각합니다. 나는 당신이 쓴 것이 잘못되었다고 말하는 것이 아니라, 더 정중 한 방식으로 표현된다면 아마도 더 나아질 것입니다.
David Z

3
"네가 오해 한 것 같아 ..." 그러나 귀하의 답변은 100 % 으르렁 거립니다.
바베큐

@Rich 또한 맨 페이지는 명확하지 않았지만 Stephen은 사용자가 " -w가 무엇을했는지 이해 하지 못하고 맨 페이지가 무엇을 말하는지 가 아니라 전자가 문제가되는 곳 " 이라는 질문을했을 것이라고 언급했습니다.
Sebi

1

루트 사용자는 원하는대로 "일반"파일 권한에 제한이 없습니다. eXecute 권한이없는 일반 파일은 직접 실행하지 않으며, 발 대상 연습에 대한 약간의 보험 만 제공합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.