vim은 루트로 다시 편집


28

나는 종종 vim에서 파일을 열고, 약간의 변경을하고, 파일을 저장할 시간이 읽기 전용 인 경우 .. (다른 사용자가 소유 함). 루트로 파일을 다시 열고 루트로 다시 복사하거나 편집하기 위해 파일을 임시 파일에 저장하지 않고 변경 사항을 유지하는 방법에 대한 팁을 찾고 있습니다.

답변:


42

stackoverflow 답변 에서 skinp

:w !sudo tee %

쓰기 권한이없는 파일을 편집하기 전에 sudo를 잊는 경우가 종종 있습니다. 해당 파일을 저장하고 권한 오류가 발생하면 임시 파일에 파일을 저장하지 않고 파일을 저장 한 다음 다시 복사하기 위해 해당 vim 명령을 실행하면됩니다.


그것은 거의 .. 그러나 vim을 다시 시작하고 루트로 실행하는 것이 좋을 것입니다. 이것은 내가 가장 좋아하는 것입니다 :)
rkthkr

@rkthkr, "vim을 다시 시작하고 루트로 실행"하면 편집 한 내용을 저장하지 못하고 실행 취소 기록을 잃을 수 있습니다. 그러나 그것이 당신이 원하는 것이라면 ... [Ran out of characters.] 내가 쓰려고하는 "답변"을보십시오.
Bruno Bronosky

2
@dbr, 파일을 덮어 쓰면 (tee로 sudo) [O] k 또는 [L] oad가 표시됩니다. 이후 옵션은 실행 취소 기록을 지우고 "수정 된 플래그"를 재설정하여 변경 사항을 저장하라는 경고없이 종료 할 수 있습니다. 내가 선호하는 이전 옵션은 실행 취소 기록을 유지하지만 종료하려고 할 때 경고를 표시합니다. 당신은 사용해야합니다 : q! 이 경우 종료하십시오. 이렇게하면 유효성 검사 (예 :! sudo /etc/init.d/httpd configtest) 및 필요한 경우 롤백 / 다시 편집 할 수 있습니다.
Bruno Bronosky

15

이에 대해 투표하지 마십시오. 이 답변을 구현하지 않는 것이 좋지만 rkthkr이 요구하는 답변입니다.

rkthkr은 말했다 :
그러나 vim을 재시작하고 루트로 실행하는 것이 좋을 것이다.

이를위한 방법은 함께 :!sudo vim %
I는 현재의 버퍼의 경로로 대체 인자 (심지어 서브 인수)수록하는 %를 ipozgaj하는 바와 같이. (암호를 묻는 메시지가 나타날 수 있습니다.) 루트가 소유 한 새로운 vim 프로세스, 즉 원래 vim 프로세스의 하위 프로세스가됩니다. 바보 같은 소리? ps의 모습은 다음과 같습니다.

~# ps afo pid,ppid,user,stat,comm
  PID  PPID USER         STAT COMMAND
16187 30478 rbronosky    Ss   bash
16510 16187 rbronosky    R+    \_ ps
30482 30478 rbronosky    Ss   bash
16244 30482 rbronosky    S+    \_ vim
16318 16244 root         S+        \_ vim

파일이 포함 된 디렉토리에 대한 쓰기 권한이 있고 파일을 편집 한 경우 스왑 파일이 종료된다는 경고가 표시 될 수 있습니다. [R] ecover를 선택하면 부모 vim 프로세스에서 수행 한 대부분 의 변경 사항 이 반영 됩니다. (* 어쩌면 스왑 업데이트를 초과 생각이나 델타 임계 값이 있습니다. 이미이에 너무 많은 시간을 넣었습니다 그것을 조회는 상관하지 않습니다.) 당신이 가서 정력 종료 할 때, 당신이 때 놀라지 않는다 여전히 vim에 있습니다 ... 두 번째 vim 프로세스를 열었습니다. 생각해 내다?

자, 그 모든 말로 ... 나는 거의 이것을하지 않을 것입니다. 어쩌면 커피가 충분하지 않거나 너무 많지 않은 경우 루트로 여러 파일을 더 편집해야한다는 것을 깨달았습니다 ...이 시도 할 수 있습니다. 14 년 동안 시스템을 관리해 본 적이 없습니다. 그러나, 당신이 내 선호하는 솔루션 (정확하게 dbr이 제공 한 것)에 불만을 표할 때까지 나는 이것에 대해 생각하지 못했습니다.


고마워 Richard! 매우 유익한 정보를 제공합니다. :)
rkthkr

이것은 매우 좋은 답변입니다. 왜 투표를하지 않습니까? 나도 +1
Mei

1
고마워 @Richard Bronosky, 내 gvim에서 sudo 암호를 입력 할 수 :w !sudo tee %없으므로 이것이 좋은 대답이라고 생각합니다.
Eric Fortis

1

나는 보통 $ HOME / tmp / apache.conf의 임시 파일에 저장합니다 (예를 들어).

sudo vimdiff $HOME/tmp/apache.conf /etc/apache2/apache.conf

이것은 변경 사항을 병합하기위한 추가 작업이지만 성과를 거두었습니다. 나는 그것이 원하지 않는 변화에 대한 편의성과 측정 사이의 좋은 방법이라는 것을 알았습니다.

그 전에 ACL에 대해 생각하거나 해당 그룹을 파일에 할당하려고했지만 소유권을 변경하는 것을 잊었거나 그렇게하지 않으려는 파일을 변경하는 경우가 종종 없었습니다.

지금까지 관리되지 않는 파일에만 적용됩니다. 우리가 사용하는 전반적인 솔루션은 사람들이 로컬에서 파일을 편집하고 적절한 서버에서 변경 사항을 테스트하는 git repo가있는 꼭두각시입니다. 구성이 원하는대로 작동하면 변경 사항이 중앙 저장소로 푸시되어 구성 엔진이 정기적으로 변경 사항을 가져옵니다.


0

필자가 가장 빠르지는 않지만 확실하게 안전한 것은 일반적으로 다음과 같은 작업을 수행하는 것입니다 (nsswitch.conf를 예로 사용)

:w! ~/%

vim을 종료하고 다음을 수행하십시오.

sudo vim nsswitch.conf
1GdG
:r ~/%

그러면 모든 행이 삭제되고 변경 및 업데이트 된 버전을 읽어 해당 위치에서 편집됩니다. 홈 디렉토리를 사용한다는 것은 액세스 권한이 있는지 여부와 / tmp보다 더 비공개인지 여부를 생각할 필요가 없다는 것을 의미합니다. 이것은 전체 파일 교체입니다. 모든 변경 사항을 추가하지 않으려면 선택하고 선택해야합니다.

이러한 답변에 관련된 두통에도 불구하고 변경 사항을 잃을 이유가 없습니다.

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