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.


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.


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%


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.



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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.