이것이 제가 훈련 기계에 umask를 사용하도록 영감을 준 것입니다.
테스트 사용자 john을 생성하고 john으로 로그인했습니다. 그리고 umask를 0200으로 설정하고 vim에서 테스트 파일을 생성하여 저장합니다. 이제 이 테스트 파일의 권한은 다음과 같습니다.
-r--rw-rw-. 1 john john 26 Jun 28 12:25 testfile
이제 파일을 다시 편집하려고 시도했는데 횡설수설이 나왔습니다.
이제 ":wq"를 사용하여 저장하려고 하면 편집기에서 파일이 읽기 전용이므로 저장할 수 없다는 메시지가 나타납니다. 하지만 끝에 느낌표 ":wq!"를 추가하면 파일이 저장됩니다.
방금 무슨 일이 일어났나요? ? 테스트 파일의 쓰기 비트가 꺼져 있어도
호스트 OS = RedHat(rhel) 7.2
답변1
"wq"를 사용하면 "!"은 Vim에게 읽기 전용 속성을 무시하도록 요청합니다. ~에서문서:
:wq [++opt] 현재 파일에 쓰고 종료합니다. 파일이 읽기 전용이거나 버퍼에 이름이 없으면 쓰기가 실패합니다. 매개변수 목록의 마지막 파일이 편집되지 않은 경우 종료가 실패합니다.
:와! [++opt] 현재 파일에 쓰고 종료합니다. 현재 버퍼에 이름이 없으면 쓰기가 실패합니다.
차이점에 유의하세요. "!"가 없으면 "파일이 읽기 전용일 때 실패했습니다..."는 더 이상 "!"에 적용되지 않습니다.
기술적으로 이런 일이 발생하는 이유는 귀하가 파일의 소유자이기 때문에 Vim은 해당 권한을 사실상 무시할 수 있기 때문입니다(최악의 경우,변경하고 복원할 수 있습니다.). 실제로 Vim은 읽기 전용 파일을 작성하는 여러 가지 방법을 지원합니다:
- 디렉터리가 쓰기 가능한 경우 기존 파일의 이름을 바꾸고(
~
이름에 추가), 새 파일을 만들고, 파일에 새 내용을 쓰고, 원본 파일의 권한을 복원합니다(Vim을 실행하는 사용자가 Vim이 아닌 경우에도 마찬가지). 파일 소유자의 사용자) - 디렉터리가 쓰기 가능하지 않으면 파일을 쓰기 가능한 디렉터리에 백업하고(
~/tmp
일반적으로) 파일의 권한을 쓰기 가능하도록 변경하고 파일에 새 콘텐츠를 쓴 다음 원래 권한을 복원합니다(Vim을 실행하는 사용자가 다음과 같은 경우에만 작동함). 파일의 소유자).
답변2
내 대답에 따르면 나는 Vim에 관심이 없지만 여러분이 우연히 발견한 기본 메커니즘을 살펴보십시오. 이는 전체 시스템의 보안에 영향을 미치기 때문에 이를 이해하는 것이 중요합니다.
소유자 독립적입니다. 시도해 보고, 자신에게 속하지 않은 파일을 만들고, 쓰는 대신 직접 읽어 보세요. 동일한 결과를 얻을 수 있습니다. 그럼 왜 이런가요?
(소유자, 루트이거나 CAP_CHOWN, CAP_DAC_OVERRIDE, CAP_FOWNER 또는 기타 기능이 있으면 가능합니다.)
이는 디렉터리의 권한 때문입니다. 디렉토리는 쓰기 가능하므로 vim은 파일을 추가할 수도 있고 삭제할 수도 있습니다. 그래서 그것이 하는 일입니다. 오래된 것을 제거하고 새 것으로 교체합니다. 이로 인해 파일의 w 비트가 대부분 권고 사항이 됩니다(디렉토리에 아무것도 기록되지 않는 경우에는 그렇지 않지만).
이보다 더 안전한 방법으로 수행하는 것이 가능합니다. 이전 항목을 이동하고, 새 항목을 만들고, 이전 항목을 삭제합니다.