Vim은 파일 권한을 손상시킬 수 있습니까?


8

나는 다른 날에 평소와 같이 Vim을 사용하고 있었고 이상한 것을 발견했습니다. 내가 한 일은 다음과 같습니다.

~$ touch testfile
~$ ls -l | grep testfile
-rw-r--r-- 1 username groupname 0 Jul 23 10:00 testfile
~$ vim testfile

그런 다음 변경하고 저장하고 종료했습니다 :wq. 꽤 정상입니다. 그러나 다음과 같습니다.

~$ sudo chown root:root testfile
~$ sudo chmod 644 testfile
~$ sudo -k
~$ ls -l | grep testfile
-rw-r--r-- root root 0 Jul 23 10:02 testfile
~$ vim testfile

따라서 root는 r / w 액세스 권한이 있어야하며 다른 모든 사용자는 읽기만해야합니다. 파일을 편집하고 저장을 시도하십시오-당신은 할 수 없습니다. 의도 한대로 작동합니다. 그러나으로 저장 :w!하면 vim은 파일 소유권을 username : usergroup으로 다시 변경하고 파일이 저장됩니다. 이 작업을 수행하더라도

~$ sudo chmod 444 testfile
~$ sudo -k
~$ ls -l | grep testfile
-r--r--r-- 1 root root 0 Jul 23 10:06 testfile
~$ vim testfile

여전히 덮어 쓸 수 있습니다 :w!! 무슨 일이야? vim이 어떻게 파일 소유권과 허가의 법칙을 어길 수 있습니까? 나는 vim의 도움말 페이지를 보면서 다음 :help :w과 같이 말했습니다 .

:w[rite]! [++opt]    Like ":write", but forcefully write when 'readonly' is set or there is another reason why writing was refused.
                     Note: This may change the permission and ownership of the file and break (symbolic) links. Add the 'W' flage to 'cpoptions' to avoid this.

이전에는 사용하지 말아야 할 때 vim에서 파일에 쓸 수 없었으므로 질문의 진정한 핵심은 vim에서 파일을 편집 할 수 없게 만드는 방법과 파일을 기반으로하지 않는 이유입니다. 시스템 권한 (예 : 예상 한 것) 및 다른 편집기 (gedit, nano)가 사용할 수없는 파일을 편집하기 위해 vim에서 사용하는 메커니즘은 무엇입니까?

편집 : 내가 시도한 컴퓨터는 Linux 커널 3.15.5-2-ARCH를 사용하고 있습니다. Vim의 버전 번호는 7.4.373-1이며 다음 버전에 의해 설치된 버전 pacman입니다. 특별한 옵션으로 처음부터 컴파일하지 않았습니다.



방금 질문의 명령을 사용하여 다시 시도했지만 동일한 방식으로 발생했습니다. 플랫폼에 따라 다를 수 있으므로 내 컴퓨터에 대한 세부 정보를 추가하기 위해 질문을 편집하겠습니다.
zrneely

첫 번째 직감은 쓰기 권한이있는 디렉토리에서 파일의 소유권을 변경할 수 있다는 것입니다. 그러나 그렇지 않은 것 같습니다 . CAP_CHOWN에 전화해야합니다 chown(2). 그건 그렇고, 나는 vim 7.4와 함께 데비안에서 재생할 수 있습니다.
Bob

답변:


10

현재 경로가 ~사용자의 홈 디렉토리 인 것을 알 수 있습니다. 해당 디렉토리에 대한 쓰기 권한이 있어야합니다.

다른 방법으로 생각하십시오-디렉토리에 대한 읽기 및 쓰기 권한이 있다면 파일 복사, 이전 파일 삭제 및 다른 권한으로 새 파일 이름 바꾸기를 방해하는 이유는 무엇입니까?

이것이 바로 vim이하는 일입니다!


strace에서 vim을 실행하는 경우 예를 들면 다음과 같습니다.

open("testfile", O_WRONLY|O_CREAT|O_TRUNC, 0644) = -1 EACCES (Permission denied)
lstat("testfile", {st_mode=S_IFREG|0644, st_size=10, ...}) = 0
getuid()                                = 1000
unlink("testfile")                      = 0
open("testfile", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 3
write(3, "ffjidfjds\n", 10)             = 10
fsync(3)                                = 0
close(3)                                = 0
chmod("testfile", 0644)                 = 0

이 로그를 기반으로 다음 프로세스를 추측 할 수 있습니다.

chown간결성을 위해 일부 이전 권한 검사 (및 시도 등)는 생략되었습니다.

  1. open 쓰기 위해 파일을 열려고합니다 (실패 : 권한 거부)
  2. lstat 파일 소유자 확인
  3. getuuid 현재 사용자 ID를 확인하여 파일 소유자와 일치하는지 확인하십시오.
  4. unlink 파일 삭제 (디렉토리에 대한 쓰기 권한 때문에 허용됨)
  5. open 같은 이름으로 새 파일을 만듭니다
  6. write 파일 내용 (앞에서 읽었고, 약간 횡설수설했다)
  7. fsync 파일을 디스크에 플러시 (실제 중요하지는 않음)
  8. close
  9. chmod 새 파일의 권한을 이전 파일처럼 보이도록 변경하십시오. 이제 새 소유자가 생깁니다.

알았어 고마워. 나는 이것을 알아 낸 것이 기쁘다. 따라서 디렉토리에 대한 쓰기 권한이 없으면 사용할 수 없습니다 :w!.
zrneely

또한, strace 정보는 매우 유용합니다. 이제는 나 자신의 조사를위한 다른 도구를 가지고 있습니다.
zrneely

1
@zrneely 팁 strace: -o옵션을 사용하여 파일에 출력을 씁니다. 그렇지 않으면 vim의 출력 과 충돌 합니다. 쓰기 권한에 관해서는, 나는 그와 함께 디렉토리 권한을 확인하는 표시되지 않습니다 stat하지만은 않는 파일을 만들려고 (이름이 4913현재 디렉토리에 임의의 것) 한 후 삭제합니다.
Bob

것 같다 4913실제로 시도 단지 이름이며, 그 목적이 있다 그렇게 할 수있는 충분한 권한이 있는지 확인합니다. 참조 : bugzilla.redhat.com/show_bug.cgi?id=427711#c6groups.google.com/forum/#!topic/vim_dev/sppdpElxY44
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.