Execute o mesmo comando novamente, mas como root


117

Às vezes, quando executo um comando, não percebo que precisava executá-lo como superusuário para ter permissão suficiente.

Existe uma maneira de executar o mesmo comando novamente, mas como um super usuário?

Respostas:


196

A maneira mais simples é executar:

sudo !!

Isso executará o último comando, mas como superusuário.

Fonte .


5
Achei isso bastante útil e não havia encontrado antes (embora possa ser de conhecimento geral). Não consegui encontrá-lo no site, então pensei em responder pessoalmente.
Trufa

30
Como um aparte, executar !!por conta própria executa o comando anterior, conforme salvo em history. Além disso, fazer !-1, !-2e assim por diante executa seu último comando, o segundo último comando e assim por diante. Handy!
Oaskamay

6
Por outro lado, !<command>executará o último evento a partir ~/.bash_historydesse início com<command>
Radu Rădeanu 27/05

1
ctrl-r também é muito útil. ele procurará no seu histórico os comandos correspondentes ao que você digita. Isso permitirá que você editar o comando antes de executá-lo novamente
KayEss

4
Essa !coisa idiota da cópia copiada tcshme ferrou mais vezes do que nunca foi útil. Aspas duplas não protegem da interpretação de !. $ foo "!bar"-> !bar: event not found.
Kaz

70

O que outras pessoas estão dizendoinsira a descrição da imagem aqui

resposta : você entra sudo !!imediatamente depois para repetir o comando anterior com privilégios escalados.

edit: Imagem encontrada via reddit , e é uma paródia da história em quadrinhos xkcd original de Randall Munroe.


3
por favor, não tenha uma conversa a favor ou contra aqui nos comentários. Se você deseja discutir o mérito ou não, use o Meta. Obrigado.
fossfreedom

17

Você pode tentar a tecla de seta para cima para percorrer seus comandos antigos e reescrevê-los / alterá-los e adicionar o que está sudona frente deles. (o botão inicial acima das teclas de seta definirá a posição para o início.)

Não gosto da sudo !!ideia, porque às vezes você adiciona outro comando no meio e não se lembra mais.


1
Felizmente, quando o fizer sudo !!, o shell se expandirá !!para que você possa ver qual comando está tentando executar. Portanto, pode ser irritante pressionar Ctrl-C e encontrar o comando certo, mas pelo menos não o levará de surpresa.
Reid

4
@Reid Não vai expandir até depois de bater entrar, e se você estiver dentro dessa janela onde você não tem que digitar sua senha novamente, ele será executado sem confirmação. +1 a usar a história em vez de cegamente usando!!
Izkata

5
@ Izkata: Suponho que seja verdade. Eu uso o zsh, apenas digito sudo !!<TAB>e ele é preenchido automaticamente !!para mim. O Bash pode expandir o histórico com M-^(para mim, alt + shift + 6), mas isso é menos fluente (você pode refazer isso). Também existe shopt -s histverify, o que faz com que, quando você usa a expansão do histórico e pressiona enter, ele fornece outra linha de prompt com a expansão executada para permitir que você a veja / edite.
Reid

1
Eu estava pensando mais sobre a situação em que digitei um comando, o comando retornou que a permissão foi negada e eu sei que quero executar exatamente o mesmo comando novamente, mas como sudo, o processo de pressionar, inicial, digitar sudo e sentir muito mais lento para mim. É assim que sempre faço isso e me sinto ineficiente.
Trufa

@ Reid: shopt -s histverifynão vai ajudar nem um pouco. A maioria das pessoas se acostuma a bater Enterduas vezes. Nesse momento, ainda é tarde para verificar o que aconteceu.
Frank Kusters

13

Vou apenas adicionar uma alternativa: tão curta quanto digitar sudo !!e mais flexível:

Up-arrow (once, or until you find the command you want to sudo/edit, if it's older)
ctrl+A   (place cursor at beginning of line)
"sudo "
Enter

É exatamente o mesmo número de pressionamentos de tecla (conto "ctrl + A" como um ...), mas adicionando "seta para cima", você pode fazer isso conforme o comando que estiver no seu histórico.


1
ctrl + A é das ligações do emacs, você também pode usar as ligações do vi ( set -o vi). Então você pode Escapar (vá para o modo de comando) e, em seguida, 'I' (maiúscula 'i', insira no início da linha).
Gerhard Burger

1
@ GerhardBurger: Eu sei, mas, estranhamente, eu amo o vi (especialmente o vim) para edição de documentos com várias linhas, mas eu prefiro muito a ligação do emacs no shell (ter que alternar do comando para o modo de edição no shell não realmente faz sentido, imo, e os atalhos do Emacs são bastante o suficiente para o uso diário, mesmo se menos poderoso)
Olivier Dulac

É verdade que eu o adicionei apenas por completo, para mim é o mesmo, porém acho a pesquisa com '/' muito conveniente;)
Gerhard Burger

@GerhardBurger: cerca vi modo de "/", regulares (ligação emacs) o bash tem também uma forma muito útil para encontrar comandos anteriores, escrevendo algumas letras, em seguida, 'ctrl + r' até encontrá-lo
Olivier Dulac

7

Há algumas maneiras de fazer isto

  • Basta digitar o comando novamente, adicionando sudoantes do comando

  • Pressione Up arrowpara obter o último comando e colocar sudona frente dele.

  • Entrar sudo !!

O !!expande para o último comando inserido. Você pode fazer coisas semelhantes com outras coisas com o histórico da linha de comando, veja aqui


7

Esta questão poderia ter sido generalizada em " Executar o mesmo comando, mas com algumas modificações ", uma vez que uma das brilhantes decisões de design no Unix é que o que é implementado uma vez no shell pode ser aproveitado por qualquer comando invocado no shell.

Em outras palavras, esse truque não se aplica apenas a sudo:

  • Repita o comando anterior como superusuário ( sudo !!)
  • Repita o comando anterior e cronometre-o ( time !!)
  • Repita o comando anterior com um ambiente diferente ( env A=b B=z !!)
  • Repita o comando anterior ( !!)

A expansão do histórico (também conhecida como substituição do histórico) é apenas um recurso do shell para facilitar a repetição de comandos anteriores (com menos pressionamentos de tecla). Verifique sua página de manual do shell para history expansion. Ele descreve muitos outros truques e atalhos que você pode fazer com o histórico, por exemplo:

Você pode consultar os comandos anteriores por número:

!55                 # repeat command number 55
!-1                 # repeat the previous command, alias for !!
!-2                 # repeat the command before the previous command

Você pode consultar palavras individuais em comandos anteriores:

some-command !$     # run some-command on the last arg of previous command

Você também pode pesquisar antes de repetir:

!?awk               # repeat the last command including the string 'awk'

Você pode pesquisar o histórico e substituir algo por outro:

!?awk?:s/str1/str2/  # repeat previous command matching 'awk' replacing str1 by str2

E muito mais, já que você pode combinar a seleção de comandos, a seleção de argumentos, pesquisar e substituir independentemente.

A página de manual do seu shell (neste caso man bash) é sua amiga.


1
brilhante! essa deve ser a resposta aceita.
Eliran Malka

5

Eu uso o zsh em vez do bash e tenho isso no meu ~/.zshrc, então, pressionando Alt+ Sinsere sudono início da linha de comando:

insert_sudo () { zle beginning-of-line; zle -U "sudo " }
zle -N insert-sudo insert_sudo
bindkey "^[s" insert-sudo

Infelizmente, não consegui encontrar uma maneira de fazer a mesma coisa no bash.


3
Você pode facilmente fazer o mesmo no Bash usando o GNU Readline: add to your ~/.inputrc "\es":"\C-asudo "e você passará para o início de uma linha longa e o sudo será inserido no início da linha ao pressionar alt-s. Reinicie o terminal ou leia novamente ~/.inputrcpara que ele funcione.

2

Se você quiser fazer isso em um alias, precisará usar alias redo='sudo $(history -p !!)'por algum motivo.


1
su -c "!!"

Se você não tem permissão para fazer root com o sudo, o programa sudo não foi instalado no sistema.


1

Do jeito que eu prefiro:

  • Tecla de seta para cima
  • Casa
  • "sudo"
  • Entrar

Mas pode ser mais fácil fazer "sudo !!", depende de você.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.