Conectado ao vi, fiz alterações, esqueci o sudo primeiro - agora o que

11

Fiz longas alterações em um arquivo de configuração em um computador Ubuntu Linux com o editor vi. Infelizmente, esqueci o sudo primeiro, agora estou no editor, mas não posso salvar minhas alterações devido à falta de direitos. Posso retroativamente sudo o usuário nesse terminal ou qual seria o melhor curso de ação a ser seguido?

simon
fonte

Respostas:

11

Nesse caso, escrevo o arquivo com :w /tmp/tmpfile. Então eu saio e mudo /tmp/tmpfilepara o meu arquivo antigo com direitos sudo.

Dom
fonte
é isso que eu acabo fazendo, mas eu gosto da resposta do wfaulk ... se eu conseguir me lembrar da próxima vez que fizer isso! :)
quack quixote
Espero que você copie o arquivo em vez de movê- lo. Mover substitui o modo do arquivo (permissões) vipelo padrão (que provavelmente é 666, ANDed pelo inverso do seu "umask"), substitui o proprietário do arquivo pelo seu UID (era "raiz", não era?), e quebra links físicos.
Scott
Alguns problemas: (1) Se o arquivo deve ser confidencial e o seu “umask” é 22 (em vez de 66), esse procedimento expõe o conteúdo do arquivo a outros usuários que possam estar monitorando o /tmpdiretório. (2) Se você tiver realmente usuários mal-intencionados em seu sistema, eles poderão substituí- /tmp/tmpfilelo quando você o escreve (de vi) e quando você o copia no arquivo de configuração do sistema que você estava editando. É mais seguro colocar o arquivo temporário em um diretório ao qual apenas você tem acesso.
Scott
40

De SO :

:w !sudo tee %

Na verdade, eu me vejo usando essa maneira de fazê-lo com mais frequência agora:

:%!sudo tee %

Eu acho que é um pouco mais intuitivo, como eu sei o que :%!faz, enquanto eu não tenho uma compreensão visceral :w !. Além disso, é fácil perder o espaço muito importante entre o we o !.

wfaulk
fonte
3
Se isso ajudar a sua intuição, lembre-se de que os vicomandos podem ter várias letras; portanto, teoricamente, pode haver um wfoocomando " "; portanto, se você deseja gravar em um arquivo chamado " foo", deve dizer " :w foo". Ou seja, você precisa de um espaço após " :w". No que diz respeito a " :w !" - você sabe o que é " :!", certo? " :!date" Executa um datecomando " ". Então " :w !xyz" escreve o buffer, mas em um comando, e não em um arquivo.
Scott
Isso deve ser a resposta aceita, já que a resposta atual existente é uma solução alternativa bastante longa, enquanto essa é uma solução imediata. OP?
bschlueter
@ Scott obrigado pela explicação! O que é tee e %embora?
CodyBugstein
@CodyBugstein: Olá. (1) Fazer ping nos autores de comentários de seis anos de idade geralmente não leva a lugar algum, pois as pessoas às vezes partem e nunca mais voltam. Mas estou acorrentado ao meu computador; Provavelmente estarei aqui para sempre. (Ou talvez não.) (2) Você já tentou fazer pesquisas? Deve ser fácil encontrar informações sobre "tee". ( % pode ser mais difícil.) (3) OK, eu vou ajudá-lo um pouco.  teeé um programa que permite gravar informações em vários locais. Por exemplo, date | tee codygravará a data e hora atuais em um arquivo chamado cody … (continua)
Scott
(Continua) ... e também para a tela do terminal.  date | tee cody > bugsteingravará a data e hora atuais em um arquivo chamado codye também em um arquivo chamado bugstein. Você entende sudo? Permite executar um comando com os privilégios de outro usuário (normalmente root). Por exemplo, ls /rootgeralmente falhará, porque você não tem acesso  /root. Mas sudo ls /rootvai funcionar. - Um efeito colateral infeliz da maneira como o Unix funciona é que sudo ls /root > /root/codyirá falhar, porque você não tem acesso e  /root, portanto, não pode escrever /root/cody. … (Continua)
Scott
-2

Não foi possível abrir outro terminal e alterar temporariamente os direitos de acesso do arquivo?

Terje Mikal
fonte
11
Esta é uma má ideia. Provavelmente não vai nunca ser um problema de segurança grande, mas poderia ser, e não há melhor e soluções mais simples (como a escrita para um arquivo temporário, ou melhor, o :w !sudo tee % solutionwfaulk postou
DBR