권한없이 열었을 때 vim을 사용하여 파일 편집


51

vim을 사용하여 파일을 편집합니다. 때로는 적절한 권한을 잊어 버리는 경우가 있습니다. vim과 파일을 읽기 전용 파일로 실행합니다. 변경할 수는 있지만 실제로는 변경할 수 없습니다. 가끔씩 파일을 열고 파일을 변경하고, sudo에서 파일을 실행하지 않았으며, 나에게 소리를 지른 다음 강제 종료하고 루트 사용자로 다시 엽니 다.

이에 대한 해결 방법이 있습니까? 파일의 읽기 전용 상태에도 불구하고 파일을 강제로 변경할 수 있습니까? 최소한 변경 사항을 저장하고 diff를 실행하고 파일을 병합 할 수 있습니까?


3
이 질문에 이미 답변 된 것으로 보입니다 : stackoverflow.com/questions/1005/…
Autumnal

사과드립니다. 나는 그 대답을 찾지 못했습니다. 감사합니다.
andor kesselman

3
[스도 트릭으로 Vim write 사용] [1] : w! sudo tee % [1] : stackoverflow.com/questions/2600783/…
Mattias Åslund

답변:


81

현재 문제에 따라 다른 접근법이있는 것 같습니다.

  1. vi로 읽기 전용 파일이있는 경우 :set readonly수행 할 수 있습니다
    • 사용 :w!힘 쓰기로, 또는
    • 문제 :set noreadonly를 해결 한 다음 정상 사용:w
  2. 권한 문제 ( sudo는가 ) : 당신은 쓸 수 있지만 sudo는 권한을가집니다.
    • 문제 : :w !sudo tee %. 파이프 정보 tee를 수신 하고 파일에 쓸 수 있는 명령에 버퍼를 씁니다. 그리고 tee는 sudo power로 실행되므로 파일을 수정할 수 있습니다.
  3. 권한 문제 ( 어떤 sudo는가 ) : 당신은 파일을 쓸 수있는 권한이없는 당신은 관리자에 액세스 할 수 없습니다.
    • 사용하여 :w! ~/tempfile.ext디렉토리에 임시 파일을 이동 조치를 취 다음 임시 파일에 대한 변경 사항을 작성하고 (디렉토리 소유자 / 관리자에 임시 파일을 전송).

자세한 내용은 여기를 참조하십시오.

  1. StackOverflow에서
  2. Geekyboy에서
  3. 데이터 Agaric에서

지름길

그것은 (보통의 경우 문제 # 2로 권한 으로, 문제 sudo는 , 당신이 당신의 위해 할 수있는) /etc/vim/vimrc(나 ~/.vimrc) 다음 바로 가기 :

  • cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!

그런 다음 sudo power :w!!를 사용하여 저장하기 만하면 됩니다. 여기서는 설명하지 않지만 위의 참조에는 많은 단축키가 포함되어 있습니다.


1
그리고 당신의 익명으로 방금 네크로맨서 배지를 받았습니다! 감사! 지금 모르도르를 변호하고있는 것 같습니다. ;)
Dr Beco

5

이 작업을 수행하는 두 가지 방법을 생각할 수 있습니다.

첫 번째 방법은 파일을 소유하고 있다고 가정하지만 파일은 읽기 전용입니다.

vi의 느낌표 접미사를 write 명령 (: w!)에 사용하면 자신의 READONLY 파일을 강제로 덮어 씁니다. 물론 이것은 현재 폴더에서 쓰고 실행할 수있는 권한이 있다고 가정합니다.

:w!

vi가 원래 READONLY 파일을 덮어 씁니다.

두 번째 방법은 다른 사람이 파일을 소유하고 있다고 가정하고 해당 파일에 변경 사항을 저장하려고합니다.

이를 수행하는 한 가지 방법은 원래 파일의 변경 사항을 vi 내에서 ed 스크립트로 저장하는 것입니다. 이 ed 스크립트는 나중에 ed line editor를 사용하여 vi 외부에서 원본 파일 (또는 다른 유사한 파일)에 적용 할 수 있습니다.

현재 편집 세션을 ed 스크립트로 저장하는 방법은 --ed 명령 행 스위치를 사용하여 원본 파일 이름과 편집 된 vi 버퍼를 표준 입력으로 diff 유틸리티에 전달하는 것입니다. 즉, 차이점을 ed 스크립트로 표시합니다.

따라서 편집 된 vi 버퍼를 가정하고 다음을 수행하십시오.

:.,$!diff --ed [original_file] -

이렇게하면 현재 버퍼 (., $!)의 모든 행이 원본 파일을 현재 버퍼의 내용으로 변환하는 데 필요한 diff 생성 ed 스크립트 (diff --ed [original_file]-)로 바뀝니다. 그런 다음이 ed 스크립트를 안전한 곳에 저장하고 스크립트를 우리가 쓸 수있는 원본 파일의 버전에 적용하려고합니다. 따라서 스크립트를 쓰기 가능한 위치 (예 : 로그인 폴더)에 저장하십시오.

:w ~/my_ed_script

이제 vi를 종료하고이 ed 스크립트를 사용하여 처음에는 저장할 수없는 편집 된 파일을 얻습니다. bash 명령 행 프롬프트 '$'에서이를 수행하는 방법은 다음과 같습니다.

$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file

이 명령 순서는 diff로 생성 한 스크립트를 연결하고 ed 쓰기 명령 'w'를 ed의 표준 입력에 에코합니다. 그런 다음 Ed는이 스크립트를 원본 파일의 쓰기 가능한 복사본에 적용하고 수정 된 버퍼 변경 사항을 파일에 다시 씁니다.

따라서 vi에서 수행 된 작업을 원래 vi, diff 및 ed를 사용하여 다른 사람이 소유 한 파일에 저장하는 방법입니다.


1

파일 쓰기 권한이없는 경우를 다루고 싶습니다.

:!chmod +w %
:w!

vim 사이에서 (플래그 변경으로 인해) 파일 변경에 대해 불평합니다-무시하는 것이 안전합니다.


0

sudo 권한이없는 경우 또 다른 가능성은을 사용 :w /somewhere/where/i/have/permissions/foo.txt하고 나중에 Ryan Fox에 따라 권한 문제를 처리하는 것 입니다.

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