Usando o vim para forçar a edição de um arquivo quando você abriu sem permissões

51

Eu uso o vim para editar um arquivo. Às vezes, esqueço de ter as permissões apropriadas. Eu corro o vim e o arquivo como um arquivo somente leitura. Posso fazer alterações, mas não posso realmente escrever as alterações. De vez em quando, acabo abrindo um arquivo e fazendo alterações, percebo que não o executei no sudo, grito comigo mesmo, forço o encerramento e o abro novamente como usuário root.

Existe uma solução alternativa para isso? Posso forçar as alterações no arquivo, apesar do status somente leitura do arquivo? Posso pelo menos salvar as alterações, executar uma comparação e mesclar os arquivos?

andor kesselman
fonte
3
Esta questão parece já ter sido respondida aqui: stackoverflow.com/questions/1005/…
29/13
Me desculpe. Não encontrei essa resposta. Obrigado.
andor Kesselman
3
Use o [Vim write with sudo trick] [1]: w! Sudo tee% [1]: stackoverflow.com/questions/2600783/…
Mattias Åslund

Respostas:

81

Parece haver algumas abordagens diferentes, dependendo do seu problema atual:

  1. Somente leitura por vi. Se o seu arquivo tiver, :set readonlyvocê pode
    • Use :w!para forçar a gravação ou
    • Emitir :set noreadonlye usar apenas o normal:w
  2. Um problema de permissão ( sudo ): você não pode escrever, mas possui direitos de sudo.
    • Edição: :w !sudo tee %. Isso gravará o buffer em tee, um comando que recebe informações de pipe e pode gravar em arquivos. E como o tee é executado com poderes sudo, o tee pode modificar o arquivo.
  3. Um problema de permissão ( sem sudo ): você não tem direitos para gravar o arquivo e não tem acesso de administrador.
    • Use :w! ~/tempfile.extpara gravar suas alterações em um arquivo temporário e, em seguida, tome medidas para mover o arquivo temporário para o diretório (envie o arquivo temporário para o proprietário / administrador do diretório).

Você pode ler mais sobre isso aqui:

  1. No StackOverflow
  2. De Geekyboy
  3. Data Agaric

Atalho

Como geralmente é o problema de caso nº 2 ( problema de permissão , com o sudo ), você pode /etc/vim/vimrc(ou ~/.vimrc) o seguinte atalho:

  • cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!

Então você pode apenas digitar :w!!para salvar com poderes sudo . Não vou explicar aqui, mas as referências acima abrangem muitos atalhos.

Dr Beco
fonte
11
E com seu anônimo como eu acabei de ganhar o distintivo de necromante! Obrigado! Estou com vontade de defender Mordor agora. ;)
Dr. Beco
5

Eu posso pensar em duas maneiras de fazer isso.

A primeira maneira assume que você possui o arquivo, mas o arquivo é READONLY.

Basta usar o sufixo do ponto de exclamação do vi no comando write (: w!) Para forçar a substituição do seu próprio arquivo READONLY. Obviamente, isso pressupõe que você tenha permissão para escrever e executar na pasta atual.

:w!

fará com que o vi substitua o arquivo READONLY original.

A segunda maneira assume que outra pessoa é proprietária do arquivo e você deseja salvar suas alterações nesse arquivo.

Uma maneira de conseguir isso é salvar as alterações feitas no arquivo original como um script ed no vi. Este script ed pode ser aplicado ao arquivo original (ou outros arquivos similares) posteriormente, fora do vi, com o editor de linha ed.

Uma maneira de salvar a sessão de edição atual como um script ed é passar o nome do arquivo original e o buffer vi editado como entrada padrão para o utilitário diff com a opção de linha de comando --ed, ou seja, exibir diferenças como um script ed.

Portanto, assumindo um buffer vi editado, execute o seguinte

:.,$!diff --ed [original_file] -

Isso substitui todas as linhas no buffer atual (., $!) Pelo script ed gerado por diff (diff --ed [original_file] -) necessário para converter o arquivo original no conteúdo do buffer atual. Em seguida, queremos salvar esse script ed em um local seguro e aplicá-lo a uma versão do arquivo original em que podemos gravar. Portanto, salve o script em um local gravável, por exemplo, na sua pasta de login:

:w ~/my_ed_script

Agora saia do vi e use este script ed para obter o arquivo editado que não pôde ser salvo em primeiro lugar. Aqui está como fazer isso no prompt da linha de comando do bash, '$':

$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file

O que essa sequência de comandos faz em palavras é catenar o script que geramos com diff e ecoa o comando ed write, 'w', para a entrada padrão de ed. Ed então aplica esse script à cópia gravável do arquivo original e grava essas alterações de buffer modificadas novamente no arquivo.

Portanto, essa é uma maneira de salvar o trabalho realizado no vi em um arquivo originalmente pertencente a outra pessoa usando vi, diff e ed.

Billy McCloskey
fonte
1

Só quero cobrir o caso quando não houver permissões de gravação de arquivo.

:!chmod +w %
:w!

Entre o vim vai reclamar sobre mudanças no arquivo (por causa da mudança de sinalizadores) - é obviamente seguro ignorá-las

yatsa
fonte
0

Outra possibilidade, no caso em que você não possui privilégios de sudo, é usar :w /somewhere/where/i/have/permissions/foo.txte depois lidar com o problema de permissões posteriormente, conforme Ryan Fox .

Jonathan Ben-Avraham
fonte