O que '!!' significa em 'sudo !!'

64

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

O que o sudo !! faz e como?

    
por RamHS 18.11.2013 / 11:24

7 respostas

74

!! no bash é um alias para o comando anterior (consulte Designadores de eventos ). Por isso, ele executa novamente o comando anterior com sudo permissions.

    
por chronitis 18.11.2013 / 11:28
64

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

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

Então, para fazer alguma coisa em termos de administração, você deve continuar com o comando sudo (Super-User DO), que diz ao sistema “você vai fazer isso, porque eu disse isso”. / bang-bang (! = bang) é basicamente um atalho que você pode usar para repetir o comando anterior.

Assim, 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 sudo para executar esse comando como superusuário / admin ou pode digitar sudo !! , em que !! informa ao sistema para usar o comando anterior que foi tentado. UfH

Existem muitos outros comandos bang. Para obter uma lista deles e explicações sobre o que eles são, confira Comandos do Bang do Linux , veja também Comando de histórico e estrondo do Bash

    
por Mitch 18.11.2013 / 11:31
38

O comando bang bang (!!) é um atalho para repetir e executar o comando anterior digitado no seu terminal. Este comando é muito útil quando você esquece que precisa de direitos de administrador para realizar uma determinada ação e permite que você o repita com direitos de superusuário simplesmente 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 - aberto (13: Permissão negada)
  E: Não é 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: Permission denied)
  E: Não é possível bloquear o diretório de administração (/ var / lib / dpkg /), você está root?

Depois disso, se executarmos o comando sudo !! , 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 !! parte pega o comando de execução anterior apt-get update e a parte anterior sudo faz com que o comando seja executado com direitos de superusuário.

E como o sudo !! executa o comando anterior com privilégios de superusuário significa que, normalmente, todos os comandos que inserimos no terminal são armazenados no comando command history .Run the history no terminal, mostra todos os comandos que você digitou. A parte !! no sudo !! pega o último comando armazenado no histórico de comandos e todo o sudo !! executa o último comando com privilégios de administrador.

Alguns outros comandos bang são explicados neste postagem no blog .

    
por Avinash Raj 18.11.2013 / 12:05
13

Há duas partes para a resposta: !! e sudo

!! faz parte da funcionalidade do shell (no caso do Ubuntu isso é provavelmente bash, mas outros shells como zsh ou csh suportam isso, também) chamado de "expansão de histórico". Ele se comporta de maneira semelhante a outras expansões em que a casca expande o "espaço reservado" para um conjunto de palavras. Enquanto foo* seria expandido para uma lista de todos os arquivos que começam 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, este comando não está ciente de que havia um !! , mas verá apenas a linha de comandos anterior. (Ao contrário de outras expansões, a expansão do histórico acontece antes que um comando seja salvo no histórico, ou seja, em vez de !! , a linha de comando substituída será salva no histórico.)

O comando sudo 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 do root permanece indefinida no Ubuntu. Para executar tarefas de administração do sistema, o usuário criado durante a instalação recebe direitos de sudo. Este usuário pode agora executar qualquer comando no shell como root, apenas prefixando sudo . Alguns programas GUI também usam o mecanismo sudo, por exemplo, gerenciamento de pacotes.

O motivo pelo qual sudo pode executar outros comandos como root (ou outro usuário) é que o binário sudo ( /usr/bin/sudo ) tem o bit setuid configurado em sua permissão e pertence ao root. Qualquer executável (binário) com bit setuid configurado é executado com as permissões de seu proprietário. Isso significa que o sudo é executado efetivamente com permissões de root, não importando qual usuário realmente o chamou. Apenas as políticas internas de segurança do sudo gerenciam qual usuário é permitido e impedem que usuários arbitrários façam coisas arbitrárias.

Portanto, no caso de sudo !! , isso significa

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

é basicamente idêntico a

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

apenas menos digitação. Em ambos os casos, o sudo só vê mount /dev/sdb1 /mnt e o executa com permissões de root.

    
por Adaephon 21.11.2013 / 00:28
5

!! é a expressão mais simples e provavelmente a mais comum para a expansão do histórico .

Como você deve ter notado, após substituir o último comando executado por !! , 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 o seu comando for lshw -c video e você executar sudo !! next, o comando após a expansão do histórico será 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 histverify não é definido 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 principal, com o texto expandido inserido automaticamente. É como se você tivesse digitado esse texto você mesmo, com o cursor no final, mas ainda não executou o comando.
  2. Você, o usuário, deve pressionar Enter para executar o comando. Ou você pode editar o comando, cancelá-lo ( Ctrl + C ), etc. Note que este não é um prompt especial, mas um prompt primário regular. É como se você mesmo tivesse digitado o texto.

(Observe que a opção histverify concha entra em vigor somente se a biblioteca readline estiver sendo usada - mas quando você usar bash interativamente em um Ubuntu ou outro sistema GNU / Linux, este é essencialmente o caso.)

Se a opção histverify shell está ou não ativada , 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. Ao contrário de outras expansões, que se destinam a ser usadas de forma interativa e não interativa (por exemplo, em um script de shell), a expansão do histórico é quase sempre usada de forma interativa.

    
por Eliah Kagan 23.04.2015 / 19:47
3

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

É muito útil nos casos em que você se esquece de colocar o sudo antes de um comando que o exige ou recebe a permissão negada ou algo parecido com isso.

sudo !!
e pronto.     
por tapananand 21.11.2013 / 20:09
0

!! irá repetir e executar o comando anterior, e com o sudo dará ao comando o privilégio de root.   (Não está na página man? !! Eu não consigo ver lá.)

    
por Farimah 18.11.2013 / 20:49