O que `!!` significa em `sudo !!`?

64

Eu sou um usuário do Ubuntu com pouca experiência e tenho usado sudo.

O que sudo !!faz e como?

RamHS
fonte
7
Duplicado de, exceto do outro lado: Execute o mesmo comando novamente, mas como sudo
um CVn 18/11/2013
6
@WarrenHill ele não quer o "como", mas o "o quê" e "como". Ele pergunta mais sobre a !!parte do comando.
Braiam
11
@Nakilon não deveria ser. Esta pergunta está perguntando o que !!fazer e como. O outro quer um método para fazer isso.
Braiam 18/11/2013
@ MichaelKjörling você quis dizer relacionado certo?
Braiam 18/11/2013
2
@Braiam Na verdade, eu quis dizer duplicado; as duas respostas mais votadas para aquela explicam especificamente o que sudo !!faz, e há duas respostas que explicam especificamente o que !!faz.
um CVn 18/11/2013

Respostas:

74

!!no bash é um alias para o comando anterior (consulte Designadores de Eventos ). Portanto, ele executa novamente o comando anterior com sudopermissões.

cronite
fonte
15
Nota: os !comandos geralmente não estão disponíveis nos scripts bash (apenas em sessões interativas). Eles podem ser desativados com set +o histexpand.
Benoit #
64

sudo bang bang é um comando muito útil ao trabalhar na interface da linha de comandos.

Algumas distribuições Linux fazem o login como usuário, em vez de administrador.

Portanto, para fazer algo em termos de administração, você deve prosseguir com o comando sudo(Superusuário DO), que informa ao sistema "você fará isso, porque eu disse isso." / bang-bang (! = bang) é basicamente um atalho que você pode usar para repetir o comando anterior.

Portanto, o cenário típico é que você tenta um comando e retrocede uma mensagem dizendo que você precisa ser um administrador para fazer isso. Portanto, você pode digitar sudopara executar esse comando como superusuário / administrador ou digitar sudo !!where !!informa ao sistema para usar o comando anterior que foi tentado. UfH

Existem muitos outros comandos de golpe. Para obter uma lista deles e explicações sobre o que são, consulte Linux Bang Commands , consulte também Histórico do Bash e comandos bang

Mitch
fonte
12
Também é um comando muito perigoso se você não tiver 100% de certeza do que era o seu comando anterior. É quase sempre mais seguro apenas pressionar a seta para cima, depois a tecla home, depois digitar sudoe olhar para a linha de comando.
Shadur
3
@Shadur Normalmente, seu comando anterior era de cerca de 1 segundo atrás. O caso de uso normal é a descrita na resposta: você se esquecer de sudoalgo e obter um erro, assim que você quer imediatamente para sudoele
Michael Mrozek
11
@Braiam: CLI é uma abreviação. Violação da regra da comunidade! Ataque! Reedite!
Indiana
4
sudonão significa "super-utilizador fazer", ele vai como fazer um comando como se eu tivesse feito su(su significa interruptor de utilizador [e não super utilizador]); ou seja, você pode sudo comandos como qualquer usuário, não apenas root ( -uswitch); o mesmo acontece comsu [user] [-c command]
ssice 18/11/2013
11
@ Mitch exceto suque não representa tal coisa. Consulte linux.die.net/man/1/su , gnu.org/software/coreutils/manual/html_node/su-invocation.html , linfo.org/su.html . Deve significar usuário substituto .
ssice
38

O bang bang (!!)comando é um atalho para repetir e executar o comando anterior que você inseriu no seu terminal. Esse comando é muito útil quando você esquece que precisa de direitos de administrador para executar uma determinada ação e permite repeti-lo com direitos de superusuário apenas digitando,

sudo !!

!! agarra o último comando de execução.

Por exemplo:

apt-get update

A saída será,

E: Não foi possível abrir o arquivo de bloqueio / var / lib / apt / lists / lock - open (13: Permissão negada)
E: Não foi possível bloquear o diretório / var / lib / apt / lists /
E: Não foi possível abrir o arquivo de bloqueio / var / lib / dpkg / lock - open (13: Permissão negada)
E: Não foi possível bloquear o diretório de administração (/ var / lib / dpkg /), você é o root?

Depois disso, se executarmos o sudo !!comando, a saída será

Hit http://extras.ubuntu.com saucy/main amd64 Packages
Get:3 http://mirror.sov.uk.goscomb.net saucy-updates Release.gpg [933 B]
Hit http://ppa.launchpad.net saucy Release                                  
Hit http://extras.ubuntu.com saucy/main i386 Packages 
Hit http://mirror.sov.uk.goscomb.net saucy Release                             
99% [Waiting for headers] [Waiting for headers] [Waiting for headers]

O que significa que a !!parte pega o comando de execução anterior apt-get updatee a sudoparte anterior o executa com direitos de superusuário.

E como as sudo !!executa o comando anterior com privilégios de superusuário significa, normalmente todos os comandos que entraram no terminal são armazenados no command history.run o historycomando no terminal, ele mostra todos os comandos que entered.The !!parte nas sudo !!garras do último comando armazenado no histórico de comandos e o conjunto sudo !!executa o último comando com privilégios de administrador.

Alguns outros comandos bang são explicados nesta postagem do blog .

Avinash Raj
fonte
3
Estou surpreso ao vê-lo mencionado 'bang bang' novamente. Eu pensei que já era o suficiente.
kiri
11
+1 para mais exemplos de comandos bang.
WernerCD
11
@Rmano Pelo menos no Bash, e espero que todas as conchas no estilo Bourne com suporte ao histórico mkdir LongDirectoryNamee cd !$devam ser emitidas separadamente para funcionar, a menos que LongDirectoryNameaconteça a última palavra do comando anterior. Para propósitos de histórico de shell, mkdir LongDirectoryName; cd !$é um comando. Interação história com !!, !^e !$usar o último comando do shell realmente totalmente processado antes de ver !. Aqui está um exemplo. Se você executar, historyverá que os comandos em uma linha unida por ;são lembrados como um comando.
Eliah Kagan 28/08
@EliahKagan, você está certo! Informações erradas excluídas ...
Rmano
13

Há duas partes na resposta: !!esudo

!!faz parte da funcionalidade do shell (no caso do Ubuntu, isso provavelmente é bash, mas outros shells como zsh ou csh também suportam isso) chamados de "expansão da história". Ele se comporta de maneira semelhante a outras expansões em que o shell expande o 'espaço reservado' para um conjunto de palavras. Embora foo*seja expandido para uma lista de todos os arquivos iniciados com 'foo', !!é expandido para o conteúdo da linha de comando anterior.

$ echo foobar
foobar
$ echo !!
echo foobar
$ !!
echo foobar

Como outras expansões, isso é feito inteiramente pelo shell; portanto, se você digitar !!após algum outro comando, esse comando não estará ciente de que havia um !!, mas verá apenas a linha de comando anterior. (Diferentemente de outras expansões, a expansão do histórico ocorre antes que um comando seja salvo no histórico, ou seja, em vez da !!linha de comando substituída será salva no histórico.)


O sudocomando permite executar comandos como outro usuário, desde que as permissões sejam concedidas pela política de segurança (o padrão é configurado em /etc/sudoers).

Por padrão, a senha root permanece não definida no Ubuntu. Para executar tarefas de administração do sistema, o usuário criado durante a instalação recebe direitos sudo. Agora esse usuário pode executar qualquer comando no shell como root, apenas acrescentando sudo. Alguns programas GUI também usam o mecanismo sudo, por exemplo, gerenciamento de pacotes.

A razão pela qual sudopode executar outros comandos como root (ou outro usuário) é que o sudo binary ( /usr/bin/sudo) tem o bit setuid definido em sua permissão e pertence ao root. Qualquer executável (binário) com bit setuid definido é executado com as permissões de seu proprietário. Isso significa que o sudo é executado efetivamente com permissões de root, independentemente do usuário que realmente o chamou. Somente as políticas de segurança interna do sudo gerenciam qual usuário tem permissão para quê e impedem que usuários arbitrários façam coisas arbitrárias.


Então, no caso sudo !!disso significa

$ mount /dev/sdb1 /mnt
mount: only root can do that
$ sudo !!

é basicamente idêntico ao

$ mount /dev/sdb1 /mnt
mount: only root can do that
$ sudo mount /dev/sdb1 /mnt

apenas menos digitação. Nos dois casos, o sudo apenas o vê mount /dev/sdb1 /mnte executa com permissões de root.

Adaephon
fonte
5

!!é a expressão sintaticamente mais simples e provavelmente a mais comum para expansão da história .

Como você deve ter notado, após substituir o último comando executado !!, o bash faz duas coisas (em sua configuração padrão):

  1. O comando completo com o texto substituído é mostrado para você.

    Por exemplo, se seu comando foi lshw -c videoe você executa a sudo !!seguir, então o comando após a expansão do histórico é sudo lshw -c video.

  2. Esse comando é executado.

Normalmente, essas duas etapas ocorrem sem interrupção e sem oportunidade de interação com o usuário, porque shopt histverifyestão desabilitadas por padrão ( shopt -u histverify).

No entanto, se você ativar shopt histverify( shopt -s histverify), a expansão do histórico funcionará de maneira diferente:

  1. Você recebe um novo prompt primário, com o texto expandido inserido automaticamente nele. É como se você tivesse digitado esse texto sozinho, com o cursor no final, mas ainda não executou o comando.
  2. Você, o usuário, deve pressionar Enterpara executar o comando. Ou você pode editar o comando, cancelá-lo ( Ctrl+ C), etc. Observe que esse não é um prompt especial, mas um prompt primário comum. É como se você tivesse digitado o texto você mesmo.

(Observe que a histverify opção shell entra em vigor apenas se a biblioteca readline estiver sendo usada - mas quando você usa o bash interativamente em um sistema Ubuntu ou outro sistema GNU / Linux, isso geralmente é sempre o caso.)

Independentemente de a histverifyopção de shell estar ativada ou não , a expansão do histórico é diferente de muitas outras expansões de shell. Outras expansões de shell não mostram o comando expandido antes de ser executado. Diferentemente de outras expansões, que devem ser usadas de maneira interativa e não interativa (por exemplo, em um script de shell), a expansão do histórico é quase sempre usada de maneira interativa.

Eliah Kagan
fonte
3

! é usado no Linux para atalhos relacionados ao histórico. Assim, !! simplesmente executará o comando anterior que você executou.

É muito útil nos casos em que você esquece de colocar o sudo antes de um comando que o exija ou você recebe permissão negada ou algo assim simplesmente

sudo !!
e pronto.

tapananand
fonte
0

!! repetirá e executará o comando anterior e, com o sudo, dará ao comando o privilégio de root. (Não está na página de manual? !! Não consigo vê-lo lá.)

Farimah
fonte
Para quem procura a página de manual:man --pager='less -p "Event Designators"' bash
Sebi