Tornando-se raiz de dentro do Vim

68

Às vezes, começo a editar arquivos de configuração em /etc usando o Vim, mas esqueço de usar sudo para iniciar o Vim. O resultado inevitável é que, depois de terminar minhas edições, eu 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. Eu poderia, claro, salvar em um local que eu possa escrever e copiar como root, mas isso também é um pouco chato.

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

    
por Mad Scientist 10.04.2011 / 12:41

5 respostas

44

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 para o design do UNIX. Na maioria das vezes, basta salvar o arquivo em / tmp como solução alternativa. Se você realmente quer salvá-lo diretamente, você pode tentar usar um recurso do Vim onde ele pode enviar um arquivo para outro processo. Tente salvar com este comando:

:w !sudo dd of=%

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

    
por 10.04.2011 / 13:01
34

Salvando o arquivo como root:

:w !sudo tee %

    
por 10.04.2011 / 15:13
13

Chame sudoedit para editar arquivos como root.

Pense no inconveniente ao chamar vim diretamente como um aviso de que você está sendo casual demais para fazer algo potencialmente perigoso.

    
por 10.04.2011 / 13:13
8

Você pode colocar isso no seu .vimrc

cmap w!! %!sudo tee > /dev/null %

Você o aciona fazendo :w!! - ele enviará o arquivo por sudo tee para o nome do arquivo atual ( % ).

De link

    
por 30.10.2011 / 14:56
3

Isso também funciona bem:

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

Isso é inspirado no comentário de @Nathan Long neste responder .

AVISO :

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

    
por 30.07.2014 / 04:15

Tags