쓰기 권한이없는 파일을 저장하는 방법은 무엇입니까?


26

때로는 파일을 열고 [read-only]상태 표시 줄 의 경고 (예 : /etc와 같은 임의의 구성 파일 /etc/resolv.conf) 를 알지 못하거나 잊어 버리지 않고 파일을 열고 내 사용자로 수정하는 경우가 있습니다.

:w!어쨌든 내 사용자에게는 쓰기 권한이 없기 때문에 분명히 실패합니다. 따라서 :w /home/filename, 종료 및 sudo mv ..., 매우 불편합니다.

현재 열린 파일을 저장할 수 있도록 일시적으로 루트로 에스컬레이션하는 방법이 있습니까? (내가 직접 sudoers또는 할 수 있다면 su)?

답변:


24

비결은 외부 호출을 사용하는 것입니다 sudo.

:w !sudo tee %

작동 원리 :

  • :w !<command>실행 <command>표준 입력으로서 버퍼의 내용.
  • teestdin을 파일에 복사합니다. & stdout; %현재 파일 이름으로 확장됩니다.
  • sudo루트 권한으로 접두사를 붙 입니다.

당신은 아니에요 정말 빔으로 파일을 저장, 오히려 당신이 편집중인 파일의 내용을 덮어 외부 프로그램을 호출하고 있습니다. 이것이 Vim으로부터 경고를받는 이유입니다 :

W12: Warning: File "xxx" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File: 

이것을 함수로 바꿀 수 있습니다.

fun! SuperWrite()
        write !sudo tee %
        " Or with :silent (but that doesn't seem to work for everyone)
        "silent write !sudo tee %
        edit!
endfun

그리고 키 바인드 :

nnoremap <Leader>w! :call SuperWrite()<CR>

를 사용 su하면 루트 사용자 만 -c명령을 즉시 실행할 수 있습니다 . 나는 당신 su이 이것을 할 수 있다고 생각 하지 않지만 아마도 내가 알지 못하는 트릭이있을 것입니다 ...


SuperWrite작동하지만 파일을 다시 에코합니다. 그것을 실행하면 :silent비밀번호를 보이지 않게 입력 할 수 있습니다.
TankorSmash

@TankorSmash 감사합니다; 업데이트 된 답변. 그래도 "비밀번호를 보이지 않게 입력"한다는 것이 무슨 의미인지 잘 모르십니까? 추가가 silent잘 작동하는 것 같습니까?
Martin Tournoij

나는 sudo와 함께 vim을 실행하지 않으므로 여기서 재생할 수 있지만 sudo tee 파일로 이동하면 sudo 암호를 입력하라는 메시지가 표시됩니다. 자동으로 표시되면 프롬프트가 표시되지 않지만 여전히 암호를 입력해야합니다.
TankorSmash

1
당신이보고있는 것은 주어진 파일뿐만 아니라 stdout에 에코하는 티의 표준 기능입니다. 해결 방법은 stdout을 / dev / null로 리디렉션하는 것입니다. la : w ! tee % > /dev/null 명령의 결과 (한 줄)가 표시되지만 전체 버퍼 내용은 반영되지 않습니다.
존 카터

파일을 출력하지 않으려면 tee출력을 사용 하고 버리는 대신 cat작동하지 않습니까?
Lie Ryan

12

내 .vimrc에서 다음 매핑을 사용하는데 유용합니다.

cnoremap w!! w !sudo tee %

w"쓰기" w!는 "강제 쓰기"이고 w!!"슈퍼 듀퍼-강제 쓰기 " 이므로 기억하기 쉽습니다 . :피


1
나는 오랫동안에 매핑 W했지만 w!!훨씬 더 이해가되며 .vimrc를 업데이트 할 것입니다. 감사합니다
jalanb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.