다음을 목격하십시오.
sh-3.2$ mkdir testcase
sh-3.2$ cd testcase
sh-3.2$ sudo touch temp
sh-3.2$ ls -al
total 0
drwxr-xr-x 3 glen staff 102 19 Dec 12:38 .
drwxr-xr-x 12 glen staff 408 19 Dec 12:38 ..
-rw-r--r-- 1 root staff 0 19 Dec 12:38 temp
sh-3.2$ echo nope > temp
sh: temp: Permission denied
sh-3.2$ vim temp
# inside vim
itheivery
# press [ESC]
:wq!
# vim exits
sh-3.2$ ls -al
total 8
drwxr-xr-x 3 glen staff 102 19 Dec 12:38 .
drwxr-xr-x 12 glen staff 408 19 Dec 12:38 ..
-rw-r--r-- 1 glen staff 7 19 Dec 12:38 temp
어떻게 든 vim은이 루트 소유 파일을 가져 와서 사용자 소유 파일로 변경했습니다!
이것은 사용자가 디렉토리를 소유 한 경우에만 작동하는 것처럼 보이지만 여전히 가능하지 않은 것처럼 느낍니다. 누구든지 이것이 어떻게 수행되는지 설명 할 수 있습니까?
답변
귀하 glen
는 디렉토리 의 소유자입니다 ( .
목록에 있는 파일 참조 ). 디렉토리는 파일 목록 일 뿐이며이 목록을 변경할 권한이 있습니다 (예 : 파일 추가, 파일 제거, 소유권 변경 등). 파일 의 내용 을 직접 변경하지 못할 수도 있지만 파일 전체를 읽고 링크를 해제 (제거) 한 후 새 파일을 추가 할 수 있습니다. 1 이전과 이후 만 목격 한 경우 파일이 변경된 것처럼 보일 수 있습니다 .
Vim은 스왑 파일을 사용하고 수 중에서 파일을 이동하므로 셸에서와 동일한 파일에 쓰는 것처럼 보이지만 같은 것은 아닙니다. 2
Vim의 기능은 다음과 같습니다.
cat temp > .temp.swp # copy file by contents into a new glen-owned file
echo nope >> .temp.swp # or other command to alter the new file
rm temp && mv .temp.swp temp # move temporary swap file back
1 이것은 Windows와 Unices 간의 파일 권한 처리에있어 중요한 차이점입니다. Windows에서는 일반적으로 쓰기 권한이없는 파일을 제거 할 수 없습니다.
2 업데이트 : 의견에서 언급했듯이 Vim은 실제로 temp
파일 의 inode 번호 가 변경되지 않기 때문에 ( ls -li
이전과 이후의) 소유권을 변경하기 위해 실제로이 방법을 수행 하지 않습니다 . 사용하여 strace
우리가 정확하게 볼 수 있습니다 vim
않습니다. 흥미로운 부분은 다음과 같습니다.
open("temp", O_WRONLY|O_CREAT|O_TRUNC, 0664) = -1 EACCES (Permission denied)
unlink("temp") = 0
open("temp", O_WRONLY|O_CREAT|O_TRUNC, 0664) = 4
write(4, "more text bla\n", 14) = 14
close(4) = 0
chmod("temp", 0664) = 0
이것은 연결 해제 만을 하고 파일 디스크립터를 닫지 는 않음을 보여줍니다 temp
. 오히려 전체 내용을 덮어 씁니다 ( more text bla\n
필자의 경우). 이것이 왜 inode 번호가 변하지 않는지를 설명합니다.
답변
전에:
-rw-r--r-- 1 root staff 0 19 Dec 12:38 temp
후:
-rw-r--r-- 1 glen staff 7 19 Dec 12:38 temp
이 vim은 권한 장벽을 뛰어 넘지 않습니다. 파일 정보를주의 깊게 살펴보면 vim이 원본 파일을 실제로 삭제했음을 알 수 있습니다 (내용을 변경할 수는 없지만 파일을 제거 할 수있는 권한이 있기 때문에). 소유자가 더 이상 ‘루트’가 아님을 참조하십시오).
그리고 vim에서 원본 파일을 편집하는 동안 읽기 전용 파일을 변경하고 있음을 경고합니다. 따라서 명령을 입력 할 때 :wq!
(작업을 강제로 수행) vim 만 할 수있는 것은 기존 파일을 삭제하고 동일한 이름의 새 파일을 만드는 것입니다.
희망이 도움이됩니다.
답변
파일 또는 다른 객체의 고유 식별자 인 inode 번호를 보려면 -i
of 옵션을 사용하십시오 ls
.
파일이 다른 객체로 바뀌 었음을 알 수 있습니다. inode 번호가 변경 될 수 있습니다.
동일한 inode 번호를 보더라도 아무 것도 증명할 수 없습니다. inode 번호를 재활용 할 수 있습니다. 파일에 대한 마지막 링크를 제거한 다음 새 파일을 만들면 동일한 inode 번호를 가진 파일을 얻을 수 있습니다. 그러나 새 파일을 만든 후에 이전 파일을 제거하면 이런 일이 발생할 수 없습니다. 예 mv file file.tmp; touch file; rm file.tmp
. 나는 vim이 실제로 이와 비슷한 것을한다고 생각한다 echo new_content > tmpfile; mv tmpfile file
. 이 mv
작업은 rename
시스템 호출로 변환 되므로 inode 번호 할당은 파일 시스템이 대상을 연결 해제하는 이름 바꾸기를 구현하는 방법에 따라 다릅니다.