rm이 읽기 전용 파일을 제거 할 수있는 이유는 무엇입니까?


91

파일을 만든 다음 사용 권한을 444(읽기 전용)으로 변경하면 어떻게 rm제거 할 수 있습니까?

내가 이렇게하면 :

echo test > test.txt
chmod 444 test.txt
rm test.txt

... rm쓰기 방지 된 파일을 제거 할 것인지 묻습니다 test.txt. 나는 rm그러한 파일을 제거 할 수 없으며 chmod +w test.txt첫 번째 작업을 수행해야한다고 기대했을 것 입니다. 내가 할 경우 rm -f test.txt다음 rm이 읽기 전용 비록,도 묻지 않고 파일을 제거합니다.

누구든지 명확히 할 수 있습니까? 우분투 12.04 / bash를 사용하고 있습니다.


설명 :이 명령을 루트가 아닌 일반 사용자로 실행하고 있습니다.
Magnus

답변:


104

모든 rm요구는 상위 디렉토리에 실행 권한을 + 쓰기입니다. 파일 자체의 권한은 관련이 없습니다.

다음 은 권한 모델을 내가 할 수있는 것보다 더 명확하게 설명 하는 참조 입니다

파일 데이터에 액세스하려면 읽기 권한이 필요합니다. 파일 데이터를 수정하려면 쓰기 권한이 필요합니다. 파일 (프로그램 또는 스크립트)을 실행하려면 실행 권한이 필요합니다 ...

디렉토리는 일반 파일과 같은 방식으로 사용되지 않으므로 권한은 약간 (그러나 약간만) 다르게 작동합니다. 디렉토리에있는 파일을 나열하려면 디렉토리에 대한 읽기 권한이 필요하지만 그 안에있는 파일에는 없습니다. 디렉토리에 파일을 추가하거나, 디렉토리에서 파일을 삭제하거나, 파일 이름을 바꾸려면 디렉토리에 대한 쓰기 권한이 필요하지만 파일에 포함되지 않은 파일에 대해서는 쓰기 권한이 필요하지 않습니다. 실행 권한은 디렉토리에 적용되지 않습니다 (디렉토리도 프로그램이 될 수 없음). 그러나 해당 권한 비트는 다른 목적으로 디렉토리에 재사용됩니다.

디렉토리에 CD를 넣으려면 (즉, 일부 디렉토리를 현재 작업 디렉토리로 만들려면) 디렉토리에서 실행 권한이 필요합니다.

디렉토리 내 파일의 "inode"정보에 액세스하려면 디렉토리에서 실행이 필요합니다. 디렉토리 내에서 파일의 inode를 읽으려면 디렉토리를 검색해야합니다. 이러한 이유로 디렉토리에 대한 실행 권한을 종종 검색 권한이라고합니다.


2
따라서 chmod를 먼저 수행하지 않고 일부 파일을 삭제 / 변경할 수없는 디렉토리를 만들려고했지만 다른 파일은 자유롭게 쓸 수 있지만 불가능한 것입니까? 디렉토리 555를 chmod해야합니다. 이는 디렉토리의 파일을 만들거나 수정할 수 없음을 의미합니다.
Magnus

3
@Magnus-물론, 읽기 전용 디렉토리 안에 쓰기 가능한 자식 디렉토리를 만들고 그 안에 쓰기 가능한 파일을 저장하는 것을 막을 수있는 것은 없습니다. 하위 디렉토리 자체는 삭제할 수 없지만 컨텐츠는 삭제할 수 있습니다.
ire_and_curses

7
+t사람들이 디렉토리에 대한 쓰기 권한이 있어도 소유하지 않은 파일을 더 이상 수정하거나 제거 할 수 없도록 디렉토리를 고정 시킬 수 없습니까?
Shadur

3
@Magnus 루트 액세스 권한 (sudo 포함)이 있으면 chattr불변 플래그를 파일에 추가하는 데 사용할 수 있습니다. 그렇지 않은 경우, ire_and_curses는 매우 정확합니다.
James O'Gorman

6
rm -f를 사용하지 않으면 냉정한 동안에 만 작동합니다 ... 게다가, 내가 작성하는 지연된 bash 스크립트가 무엇인지 또는하지
Magnus

53

좋아, ire_and_curses에 대한 귀하의 의견에 따르면, 실제로하고 싶은 것은 일부 파일을 변경할 수 없게 만드는 것입니다. chattr명령 을 사용하여이를 수행 할 수 있습니다 . 예를 들면 다음과 같습니다.

예 :

$ cd /tmp
$ touch immutable-file
$ sudo chattr +i immutable-file

$ rm -f immutable-file
rm: remove write-protected regular empty file `immutable-file'? y
rm: cannot remove `immutable-file': Operation not permitted

$ mv immutable-file someothername
mv: cannot move `immutable-file' to `someothername': Operation not permitted

$ echo foo > immutable-file 
-bash: immutable-file: Permission denied

변경할 수없는 파일에 대해서는 아무것도 할 수 없습니다. 삭제, 편집, 덮어 쓰기, 이름 바꾸기, chmod 또는 chown 등을 수행 할 수 없습니다. 그것으로 할 수있는 유일한 것은 그것을 읽고 (unix 권한이 허용되는 경우) 그리고 ( chattr -i불변의 비트를 제거하기 위해 ) 루트로 .

모든 파일 시스템이 모든 속성을 지원하는 것은 아닙니다. AFAIK, 불변은 모든 일반적인 리눅스 파일 시스템에서 지원됩니다 (ext2 / 3 / 4 및 xfs 포함. zfsonlinux는 현재 속성을 전혀 지원하지 않습니다)


3
때때로 유용합니다. btw, 루트조차도 불변 파일을 수정하거나 삭제할 수 없습니다 (불변 속성을 먼저 제거하지 않고). 또한 btw, lsattr속성을 나열 하는 데 사용 하십시오.
cas

2
+1 - 내가 속성에 대해 잊고, 약 리터럴 질문에 대답 바빠서했던 rm...이도 나에게 발생 결코를
ire_and_curses

2
이것은 파일 시스템마다 다르며 더 많은 문제를 해결할 수 있습니다.
Stéphane Gimenez

4
@ Magnus : 가능한 문제는 백업 (모든 백업 유틸리티가 속성을 백업하지는 않지만 대부분은 그렇지 않습니다) 및 복원 (불변 파일이 들어있는 디렉토리로 복원하는 경우 일부 프로그램은 해당 파일을 덮어 쓸 수 없음을 처리합니다) 치명적인 오류와 중단으로). 또한 파일을 변경 불가능하게 만들고 파일을 삭제할 수없는 이유를 알 수없는 경우 혼동을 일으킬 수 있습니다. '작업이 허용되지 않음'오류 메시지는 일부 파일 시스템에서 볼 수있는 것과 동일한 오류 메시지 입니다. 손상으로 인해 잠재적으로 위험한 과반 응이 발생할 수 있습니다.
cas

1
변경 불가능한 파일을 복사 (cp) 있습니다 .
Octopus

0

이 질문에 대한 한 가지 대답은 write권한이있는 경우에만 디렉토리에서 파일을 삭제할 수 있다고 주장합니다 ! 먹어봐! 디렉토리에 write권한을 부여하고 삭제하려고하면 할 수 없습니다!
디렉토리 안의 파일을 삭제하려면 디렉토리에 대한 권한 writeexecute권한 이 모두 필요합니다

이제 질문으로 돌아갑니다. 파일을 삭제하려면 rm디렉토리에서 inode 정보를 제거하는 shredding것입니다. 즉 디스크 가 아닙니다 . 파일의 inode 정보가 디렉토리에 없으면 액세스 할 수 없습니다 (또한 상위 디렉토리에 나열되어 있지 않으므로 볼 수 없기 때문에). 즉, 사용자를 위해 삭제됩니다 .
따라서 디렉토리에서 파일을 삭제하려면 디렉토리에 대한 권한 만 있으면됩니다. 해당 파일에 대한 권한은 관련이 없습니다

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