Frequentemente, ao editar os arquivos de configuração, vou abrir um com o vi e, quando for salvá-lo, percebo que não digitei
sudo vi filename
Existe alguma maneira de dar privilégios ao vi sudo para salvar o arquivo? Eu me lembro de ter visto algo sobre isso enquanto procurava algumas coisas sobre o vi há um tempo atrás, mas agora não consigo encontrá-lo.
Respostas:
%
é substituído pelo nome do arquivo atual, portanto, você pode usar:(
vim
detectará que o arquivo foi alterado e perguntará se você deseja que ele seja recarregado. Diga sim escolhendo em[L]
vez de OK.)Como atalho, você pode definir seu próprio comando. Coloque o seguinte em seu
.vimrc
:Com o exposto acima, você pode digitar
:W<Enter>
para salvar o arquivo. Desde que escrevi isso, achei uma maneira melhor (na minha opinião) de fazer isso:Dessa forma, você pode digitar
:w!!
e será expandido para a linha de comando completa, deixando o cursor no final, para que você possa substituí-lo%
por um nome de arquivo próprio, se desejar.fonte
sudo: 1 incorrect password attempt
/etc/sudoers
arquivo, adicionaryour_username ALL=(ALL) ALL
abaixo da linharoot ALL=(ALL) ALL
, sair e salvar.visudo
.Em geral, você não pode alterar o ID do usuário efetivo do processo vi, mas pode fazer isso:
fonte
:w !sudo tee % >/dev/null
ou:w !sudo dd of=%
evite que o conteúdo do arquivo seja repetido à medida que o arquivo é salvo.tee
e vi que era um comando de canal Unix e!
insere um comando de shell. A:w
escrita está padronizadatee
?Advertências comuns
O método mais comum de solucionar o problema do arquivo somente leitura é abrir um canal no arquivo atual como superusuário usando uma implementação de
sudo tee
. No entanto, todas as soluções mais populares que eu encontrei na Internet têm uma combinação de várias advertências em potencial:Soluções
Para contornar todos esses problemas, você pode usar o seguinte comando:
Estes podem ser reduzidos, respeitosamente:
Explicação
:
inicia o comando; você precisará digitar esse caractere no modo normal para começar a digitar um comando. Deve ser omitido nos scripts.sil[ent]
suprime a saída do comando. Nesse caso, queremos parar oPress any key to continue
prompt -like que aparece após a execução do:!
comando.exec[ute]
executa uma string como um comando. Não podemos simplesmente executar,:write
porque não processará a chamada de função necessária.!
representa o:!
comando: o único comando que:write
aceita. Normalmente,:write
aceita um caminho de arquivo no qual gravar.:!
por si só executa um comando em um shell (por exemplo, usandobash -c
). Com:write
, ele executará o comando no shell e gravará o arquivo inteiro emstdin
.sudo
deve ser óbvio, já que é por isso que você está aqui. Execute o comando como superusuário. Há muita informação na rede sobre como isso funciona.tee
canalizastdin
para o arquivo especificado.:write
gravará emstdin
, o superusuáriotee
receberá o conteúdo do arquivo e o gravará. Ele não criará um novo arquivo - apenas substitua o conteúdo - para que os modos e atributos do arquivo sejam preservados.shellescape()
escapa caracteres especiais no caminho do arquivo, conforme apropriado para o shell atual. Com apenas um parâmetro, normalmente apenas coloque o caminho entre aspas, conforme necessário. Como estamos enviando para uma linha de comando do shell completa, queremos passar um valor diferente de zero como o segundo argumento para permitir a fuga de barra invertida de outros caracteres especiais que, de outra forma, poderiam desarmar o shell.@%
lê o conteúdo do%
registro, que contém o nome do arquivo do buffer atual. Não é necessariamente um caminho absoluto, portanto, verifique se você não alterou o diretório atual. Em algumas soluções, você verá o símbolo comercial em omitido. Dependendo da localização,%
é uma expressão válida e tem o mesmo efeito que a leitura do%
registro. Aninhado dentro de outra expressão, o atalho geralmente não é permitido: como neste caso.>NUL
e>/dev/null
redirecionestdout
para o dispositivo nulo da plataforma. Mesmo que tenhamos silenciado o comando, não queremos que toda a sobrecarga associada ao canal destdin
volta ao vim - o melhor seja despejá-lo o mais cedo possível.NUL
é o dispositivo nulo no DOS, MS-DOS e Windows, não um arquivo válido. No Windows 8, os redirecionamentos para NUL não resultam na gravação de um arquivo chamado NUL. Tente criar um arquivo na área de trabalho chamado NUL, com ou sem uma extensão de arquivo: você não poderá fazer isso. (Existem vários outros nomes de dispositivos no Windows que valem a pena conhecer.)~ / .vimrc
Dependente da plataforma
Obviamente, você ainda não deseja memorizá-las e digitá-las sempre. É muito mais fácil mapear o comando apropriado para um comando de usuário mais simples. Para fazer isso no POSIX, você pode adicionar a seguinte linha ao seu
~/.vimrc
arquivo, criando-a se ela ainda não existir:Isso permitirá que você digite o comando: W (diferencia maiúsculas de minúsculas) para gravar o arquivo atual com permissões de superusuário - muito mais fácil.
Plataforma independente
Eu uso um
~/.vimrc
arquivo independente de plataforma que sincroniza entre computadores, então adicionei a funcionalidade de várias plataformas à minha. Aqui está um~/.vimrc
com apenas as configurações relevantes:fonte
sudo
exista, mas não exista/dev/null
; portanto, você precisará ficar mais sofisticado se quiser um verdadeiro suporte entre plataformas. É mais uma introdução - alimento para o pensamento. :)Se você estiver usando o Vim , existe um script disponível chamado sudo.vim . Se você achar que abriu um arquivo que precisa de acesso root para ler, digite
O Vim substitui o% pelo nome do arquivo atual esudo:
instrui o script sudo.vim a assumir a leitura e gravação.fonte
O conselho de Ryan geralmente é bom; no entanto, se seguir a etapa 3, não mova o arquivo temporário; terá a propriedade e as permissões incorretas. Em vez disso,
sudoedit
o arquivo correto e leia o conteúdo (usando:r
ou semelhante) do arquivo temporário.Se seguir a etapa 2, use
:w!
para forçar a gravação do arquivo.fonte
Quando você entra no modo de inserção em um arquivo que precisa de acesso sudo para editar, você recebe uma mensagem de status dizendo
Se sinto falta disso, geralmente sinto
..então..
..ou..
Provavelmente existe uma maneira menos indireta de fazê-lo, mas funciona.
fonte
Um rápido Google parece dar este conselho:
http://ubuntuforums.org/showthread.php?t=782136
fonte
Aqui está outro que apareceu desde que essa pergunta foi respondida, um plug-in chamado SudoEdit que fornece as funções SudoRead e SudoWrite, que por padrão tentam usar o sudo primeiro e su se isso falhar: http://www.vim.org/scripts/ script.php? script_id = 2709
fonte
Eu tenho isso no meu ~ / .bashrc:
Agora, sempre que preciso editar um arquivo de configuração, basta abri-lo com o svim.
fonte
sudoedit
comando deve ser preferido, pois não requer a execução do vim como root.Um hack rápido que você pode considerar é fazer um chmod no arquivo que você está editando, salvar com o vim e depois voltar ao que o arquivo estava originalmente.
É claro que eu não recomendo essa abordagem em um sistema em que você está preocupado com a segurança, pois por alguns segundos alguém pode ler / alterar o arquivo sem que você perceba.
fonte