vim reedite como root

28

Costumo abrir um arquivo no vim, faço algumas alterações e quando é hora de salvar o arquivo é somente leitura .. (de propriedade de outro usuário). Estou procurando dicas sobre como abrir novamente o arquivo como root e manter minhas alterações sem antes salvá-lo em um arquivo temporário para copiar ou reeditar como root.

rkthkr
fonte

Respostas:

42

A partir desta resposta de stackoverflow , por skinp

:w !sudo tee %

Costumo esquecer o sudo antes de editar um arquivo no qual não tenho permissão de gravação. Quando venho para salvar esse arquivo e recebo um erro de permissão, apenas emito esse comando vim para salvar o arquivo sem a necessidade de salvá-lo em um arquivo temporário e copiá-lo novamente.

dbr
fonte
Isso é quase isso .. Mas seria bom ter vim reiniciado e executado como root .. Este é o meu favorito até agora :)
rkthkr
@rkthkr, se "o vim for reiniciado e executado como root", você não poderá salvar as edições feitas e perder o histórico de desfazer. Mas se é isso que você quer ... [Ficou sem caracteres.] Veja a "resposta" que estou prestes a escrever.
Bruno Bronosky
2
@dbr, acho que vale a pena mencionar que depois de sobrescrever o arquivo (com tee como sudo), você será solicitado com [O] k ou [L] oad. A opção posterior apagará o histórico de desfazer e redefinirá o "sinalizador modificado", permitindo que você saia sem ser avisado para salvar as alterações. A opção anterior, que eu prefiro, preservará seu histórico de desfazer, mas fará com que você seja avisado ao tentar sair. Você tem que usar: q! sair neste caso. Eu faço isso para que eu possa validar (por exemplo:! Sudo /etc/init.d/httpd configtest) e reverter / reeditar, se necessário.
Bruno Bronosky
15

Por favor, não me vote para isso. Eu não recomendo implementar esta resposta, mas é a resposta que o rkthkr está pedindo.

rkthkr disse:
Mas seria bom ter o vim reiniciado e executado como root

A maneira de fazer isso é com :!sudo vim %
Como mencionei a ipozgaj, um% como argumento (mesmo um sub-argumento) é substituído pelo caminho para o buffer atual. (Você pode ser solicitado a fornecer sua senha.) Você termina com um novo processo do vim, de propriedade do root, que é um processo filho do processo original do vim. Parece pateta, certo? Aqui está o que parece no 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

Se você tiver permissões de gravação no diretório que contém o arquivo e tiver feito edições nele, poderá receber um aviso de que existe um arquivo de troca. A escolha de [R] ecover refletirá a maioria * das alterações feitas pelo processo pai vim. (* Acho que talvez a atualização de troca tenha um tempo ou um limite delta. Já dediquei muito tempo a isso e não me importo de pesquisá-la.) Quando você sair do vim, não se assuste quando estiver ainda no vim ... você abriu um segundo processo do vim. Lembrar?

Agora, com tudo isso dito ... eu quase nunca faria isso. Talvez, se eu não tomei café suficiente ou em excesso e percebi que precisaria editar vários outros arquivos como root ... eu poderia tentar isso. Em 14 anos de administração de sistemas, nunca o fiz. Mas, até que você expressasse descontentamento com a minha solução preferida (que é exatamente como a dbr oferecida), eu nunca havia pensado nisso.

Bruno Bronosky
fonte
Graças Richard! Muito informativo, vou dar-lhe um para ele :)
rkthkr
Esta é uma resposta de alta qualidade: por que votar? +1 de mim também.
Mei
1
Obrigado @ Richard Bronosky, no meu gvim não é possível digitar a senha do sudo, :w !sudo tee %então acho que essa é uma boa resposta.
Eric Fortis
1

Normalmente, eu o salvo em um arquivo temporário em $ HOME / tmp / apache.conf (por exemplo) e depois

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

este é um trabalho extra para mesclar as alterações, mas valeu a pena. Acho que é uma boa maneira entre conveniência e medidas contra alterações indesejadas

Antes disso, eu pensava nas ACLs ou na atribuição de grupos correspondentes aos arquivos, mas não dava certo com frequência. Eu esqueci de mudar a propriedade ou estava mudando os arquivos onde não pretendia fazê-lo.

Isso vale apenas para arquivos que não são gerenciados até agora. A solução geral que usamos é o fantoche com um repositório git, onde as pessoas editam arquivos localmente e testam as alterações nos servidores apropriados, se a configuração funcionar como desejado, as alterações serão enviadas de volta ao repositório central, onde nosso mecanismo de configuração realiza alterações em intervalos regulares.

serverhorror
fonte
0

O que normalmente faço - não necessariamente o mais rápido, mas certamente seguro - é fazer algo assim (usando o nsswitch.conf como exemplo):

:w! ~/%

Saia do vim e faça:

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

Isso excluirá todas as linhas e lerá sua versão alterada e atualizada para ser editada em seu lugar. Usar o diretório inicial significa que você não precisa pensar se tem acesso ou não - e é mais privado que / tmp. Observe bem que essa é uma substituição completa do arquivo: se você não quiser adicionar todas as alterações, terá que escolher.

Apesar da dor de cabeça envolvida em qualquer uma dessas respostas, não há motivo para perder suas alterações.

Mei
fonte