Cosa significa `!!` in `sudo !!`?


64

Sono un utente di Ubuntu con poca esperienza e ho usato sudo.

Cosa fa sudo !!e come?


7
Duplicato di, tranne dall'altra parte: eseguire di nuovo lo stesso comando ma come sudo
un CVn

6
@WarrenHill non vuole il "come" ma il "cosa" e il "come". Chiede di più sulla !!parte del comando.
Braiam,

1
@Nakilon non dovrebbe essere. Questa domanda è chiedere cosa !!fare e come. L'altro vuole un metodo per farlo.
Braiam,

@ MichaelKjörling volevi dire correlato giusto?
Braiam,

2
@Braiam In realtà, intendevo duplicato; le due risposte più votate a quella spiegano specificamente cosa sudo !!fa, e ci sono due risposte che spiegano in modo specifico cosa !!fa.
un CVn il

Risposte:


74

!!in bash è un alias per il comando precedente (vedi Designatori di eventi ). Quindi esegue nuovamente il comando precedente con sudoautorizzazioni.


15
Nota: i !comandi di solito non sono disponibili negli script bash (solo nelle sessioni interattive). Possono essere disabilitati con set +o histexpand.
Benoit,

64

sudo bang bang è un comando molto utile quando si lavora nell'interfaccia della riga di comando.

Alcune distribuzioni Linux ti consentono di accedere come utente anziché come amministratore.

Quindi, per fare qualcosa in termini di amministrazione, devi procedere con il comando sudo(DO superutente), che dice al sistema "lo farai, perché l'ho detto." Il !! / bang-bang (! = bang) è sostanzialmente una scorciatoia che puoi usare per ripetere il comando precedente.

Quindi, lo scenario tipico è che si prova un comando e si respinge un messaggio che dice che è necessario essere un amministratore per farlo. Quindi, puoi digitare sudoper eseguire quel comando come superutente / admin, oppure puoi digitare sudo !!dove !!dice al sistema di usare il comando precedente che era stato tentato. UfH

Ci sono molti altri comandi bang. Per un elenco di questi e spiegazioni su cosa sono, dai un'occhiata ai Comandi Bang di Linux , vedi anche Cronologia di Bash e comandi di bang


12
È anche un comando molto pericoloso se non sei sicuro al 100% di quale fosse il tuo comando precedente. È quasi sempre più sicuro premere la freccia su, quindi il tasto Home, quindi digitare sudoe guardare la riga di comando.
Shadur,

3
@Shadur Di solito il tuo comando precedente era circa 1 secondo fa. Il caso d'uso normale è quella descritta nella risposta: si dimentica di sudoqualcosa e ottiene un errore, così si vuole immediatamente per sudoessa
Michael Mrozek

1
@Braiam: CLI è un'abbreviazione. Violazione delle regole della comunità! Attacco! Re-edit!
Indiano

4
sudonon significa "super-user fare", si va come fare un comando come se avessi fatto su(su che significa interruttore utente [e non super utente]); vale a dire, puoi eseguire i comandi sudo come qualsiasi utente, non solo root ( -uswitch); lo stesso vale persu [user] [-c command]
ssice, il

1
@Mitch tranne sunon rappresenta una cosa del genere. Vedi linux.die.net/man/1/su , gnu.org/software/coreutils/manual/html_node/su-invocation.html , linfo.org/su.html . Dovrebbe significare un utente sostitutivo .
dal

38

Il bang bang (!!)comando è un collegamento per ripetere ed eseguire il comando precedente inserito nel terminale. Questo comando è molto utile quando dimentichi che hai bisogno dei diritti di amministratore per eseguire una determinata azione e ti consente di ripeterlo con i diritti di superutente semplicemente digitando,

sudo !!

!! prende l'ultimo comando di esecuzione.

Per esempio:

apt-get update

L'output sarà,

E: Impossibile aprire il file di blocco / var / lib / apt / lists / lock - open (13: autorizzazione negata)
E: Impossibile bloccare la directory / var / lib / apt / lists /
E: Impossibile aprire il file di blocco / var / lib / dpkg / lock - open (13: Autorizzazione negata)
E: Impossibile bloccare la directory di amministrazione (/ var / lib / dpkg /), sei root?

Dopodiché, se eseguiamo il sudo !!comando, l'output sarà

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]

Il che significa che !!parte prende il comando di esecuzione precedente apt-get updatee la sudoparte precedente fa eseguire il comando con i diritti di superutente.

E come le sudo !!piste del comando precedente con i privilegi di superuser significa, normalmente tutti i comandi siamo entrati sul terminale sono memorizzati nel command history.Run il historycomando sul terminale, si vede tutti i comandi entered.The !!parte alle sudo !!palio l'ultimo comando memorizzato nella cronologia dei comandi e l'intero sudo !!esegue l'ultimo comando con privilegi di amministratore.

Alcuni altri comandi di botto sono spiegati in questo post del blog .


3
Sono sorpreso di vederlo di nuovo menzionato "bang bang". Ho pensato che una volta fosse abbastanza.
Kiri,

1
+1 per altri esempi di comandi bang.
WernerCD,

1
@Rmano Almeno in Bash, e mi aspetto che tutte le shell in stile Bourne con supporto cronologico, mkdir LongDirectoryNamee cd !$debbano essere emesse separatamente per funzionare, a meno che non LongDirectoryNamecapiti che sia stata l'ultima parola del comando precedente. Ai fini della cronologia della shell, mkdir LongDirectoryName; cd !$è un comando. Interazione della cronologia con !!, !^e !$usa l'ultimo comando che la shell ha completamente elaborato prima di vedere !. Ecco un esempio Se esegui history, vedrai che i comandi su una linea unita ;sono ricordati come un comando.
Eliah Kagan,

@EliahKagan hai ragione! Informazioni errate cancellate ...
Rmano,

13

Ci sono due parti per la risposta: !!esudo

!!fa parte della funzionalità della shell (nel caso di Ubuntu questo è probabilmente bash, ma anche altre shell come zsh o csh lo supportano) chiamato "espansione della storia". Si comporta in modo simile alle altre espansioni in quanto la shell espande il "segnaposto" in un insieme di parole. Mentre foo*sarebbe espanso in un elenco di tutti i file che iniziano con 'pippo', !!viene espanso al contenuto della precedente riga di comando.

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

Come altre espansioni, questo viene fatto interamente dalla shell, quindi se si digita !!dopo qualche altro comando, questo comando non è a conoscenza dell'esistenza di un !!, ma vedrà solo la riga di comando precedente. (A differenza di altre espansioni, l'espansione della cronologia si verifica prima che un comando venga salvato nella cronologia, ovvero !!la riga di comando sostituita verrà salvata nella cronologia.)


Il sudocomando consente di eseguire comandi come un altro utente, a condizione che le autorizzazioni siano concesse dalla politica di sicurezza (l'impostazione predefinita è configurata in /etc/sudoers).

Per impostazione predefinita, la password di root rimane non impostata in Ubuntu. Per eseguire le attività di amministrazione del sistema, all'utente creato durante l'installazione sono concessi i diritti sudo. Questo utente può ora eseguire qualsiasi comando sulla shell come root, semplicemente anteponendo sudo. Alcuni programmi con GUI usano anche il meccanismo sudo, ad esempio la gestione dei pacchetti.

Il motivo per cui è sudopossibile eseguire altri comandi come root (o un altro utente) è che sudo binary ( /usr/bin/sudo) ha il bit setuid impostato nella sua autorizzazione e appartiene a root. Qualsiasi eseguibile (binario) con set setuid bit viene eseguito con le autorizzazioni del suo proprietario. Ciò significa che sudo funziona in modo efficace con i permessi di root, indipendentemente da quale utente lo abbia effettivamente chiamato. Solo le politiche di sicurezza interne di sudo gestiscono a quale utente è permesso cosa e impediscono agli utenti arbitrari di fare cose arbitrarie.


Quindi, nel caso di sudo !!questo significa

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

è sostanzialmente identico a

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

solo meno digitando. In entrambi i casi sudo lo vede mount /dev/sdb1 /mnte lo esegue con i permessi di root.


5

!!è l'espressione sintatticamente più semplice e probabilmente più comune per l' espansione della storia .

Come avrai notato, dopo aver sostituito l'ultimo comando eseguito !!, bash fa due cose (nella sua configurazione predefinita):

  1. Viene mostrato il comando completo con il testo sostituito.

    Ad esempio, se il tuo comando è stato lshw -c videoed esegui sudo !!successivamente, il comando dopo l'espansione della cronologia è sudo lshw -c video.

  2. Questo comando viene eseguito.

Normalmente questi due passaggi si verificano senza interruzione e senza possibilità di interazione con l'utente, perché shopt histverifynon è impostato di default ( shopt -u histverify).

Tuttavia, se si abilita shopt histverify( shopt -s histverify), l'espansione della cronologia funziona in modo diverso:

  1. Viene visualizzato un nuovo prompt principale, con il testo espanso inserito automaticamente su di esso. È come se tu avessi digitato quel testo da solo, con il cursore alla fine, ma non avessi ancora eseguito il comando.
  2. L'utente deve quindi premere Enterper eseguire il comando. Oppure puoi modificare il comando, annullarlo ( Ctrl+ C), ecc. Nota che questo non è un prompt speciale, ma un prompt primario normale. È come se tu stessi scrivendo il testo da solo.

(Nota che l' histverify opzione shell ha effetto solo se viene utilizzata la libreria readline - ma quando usi bash in modo interattivo su un sistema Ubuntu o GNU / Linux, questo è essenzialmente sempre il caso.)

Indipendentemente dal fatto che l' histverifyopzione shell sia abilitata , l'espansione della cronologia è dissimile da molte altre espansioni della shell. Altre espansioni della shell non mostrano il comando espanso prima che venga eseguito. A differenza di altre espansioni, che devono essere utilizzate in modo interattivo e non interattivo (ad esempio, in uno script di shell), l'espansione della cronologia viene quasi sempre utilizzata in modo interattivo.


3

! è usato in Linux per le scorciatoie relative alla storia. Così, !! eseguirà semplicemente il comando precedente che hai eseguito.

È molto utile nei casi in cui o si dimentica di mettere sudo prima di un comando che lo richiede o si ottiene l'autorizzazione negata o qualcosa del genere

sudo !!
e hai finito.


0

!! ripeterà ed eseguirà il comando precedente e con sudo darà al comando il privilegio di root. (Non è nella pagina man? !! Non riesco a vederlo lì.)


Per chiunque cerchi la pagina man:man --pager='less -p "Event Designators"' bash
Sebi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.