Tornando-se raiz a partir do Vim

72

Às vezes, começo a editar arquivos de configuração /etcusando o Vim, mas esqueço de usá-lo sudopara iniciar o Vim. O resultado inevitável é que, depois de terminar minhas edições, encontro o temido aviso de que não tenho permissão para salvar o arquivo.

Principalmente as edições são pequenas o suficiente para eu sair do Vim e fazer a coisa toda novamente como root. É claro que eu poderia salvar em um local para escrever e copiar como root, mas isso também é um pouco chato.

Mas tenho certeza de que existe uma maneira mais fácil de se tornar root ou usar sudode dentro do Vim, sem precisar descartar as alterações. Se o método não depender de sudoser configurado para o usuário, isso seria ainda melhor.

Cientista maluco
fonte
11
Eu adquiri o hábito de usar em sudoeditvez de vimpara todas as edições de administração. É uma maneira de nunca mais encontrar esse problema :). +1 para a resposta de Gilles .
Jw013
Essas perguntas e respostas alernativas da SO são úteis, portanto, crie links para elas aqui: Obtendo permissões de root em um arquivo dentro do vi? & Como o truque do vim "escreve com sudo" funciona? .
Slm

Respostas:

46

O sudo não pode alterar o usuário efetivo de um processo existente, ele sempre cria um novo processo que possui privilégios elevados e o shell original não é afetado. Isso é fundamental no design do UNIX. Na maioria das vezes, salvei o arquivo em / tmp como uma solução alternativa. Se você realmente deseja salvá-lo diretamente, tente usar um recurso do Vim onde ele pode canalizar um arquivo para outro processo. Tente salvar com este comando:

:w !sudo dd of=%

Testado e funciona. O Vim solicitará que você recarregue o arquivo, mas é desnecessário: basta pressionar opara evitar recarregar e perder o histórico de desfazer. Você pode até salvar isso em um comando / função do Vim ou até vinculá-lo a uma chave para facilitar o acesso, mas deixarei isso como um exercício para o leitor.

penguin359
fonte
2
Essa é uma solução interessante, mas você pode substituir o caminho %, que no vim será o caminho do arquivo que você está editando no momento.
Reid
Você deve colocar as %aspas entre, caso o nome do arquivo contenha um espaço.
intuited
Além disso: isso não redefinirá a 'modified'configuração; você pode fazer isso manualmente com set nomodified.
intuited
2
Na verdade, se você realmente quer ser cuidadoso, você deve fazer exec 'w !sudo dd of=' . shellescape(expand('%'))no caso do nome do arquivo contém aspas, barras invertidas, dólar-sinais, etc.
intuído
Como isso é diferente do comando Commandlinefu por placas?
36

Salvando o arquivo como root:

: w! sudo tee%

placas
fonte
13

Ligue sudoeditpara editar arquivos como raiz.

Pense no inconveniente ao ligar vimdiretamente como um aviso de que você está sendo muito casual ao fazer algo potencialmente perigoso.

Gilles 'SO- parar de ser mau'
fonte
3

Isso também funciona bem:

:w !sudo sh -c "cat > %"

Isso é inspirado no comentário de @Nathan Long nesta resposta .

AVISO :

"deve ser usado em vez de 'porque queremos %ser expandidos antes de passar para o shell.

feihu
fonte