!!
no bash é um alias para o comando anterior (consulte Designadores de eventos ). Por isso, ele executa novamente o comando anterior com sudo
permissions.
Eu sou um usuário do Ubuntu com pouca experiência e tenho usado sudo
.
O que o sudo !!
faz e como?
!!
no bash é um alias para o comando anterior (consulte Designadores de eventos ). Por isso, ele executa novamente o comando anterior com sudo
permissions.
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
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.
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 .
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.
!!
é 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):
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
.
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:
(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.
é 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.
!! 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á.)
Tags command-line sudo