Che cosa significa '!!' significa in 'sudo !!'?

64

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

Che cosa fa sudo !! e come?

    
posta RamHS 18.11.2013 - 11:24

7 risposte

74

!! in bash è un alias per il comando precedente (vedi Event Designators ). Quindi esegue nuovamente il comando precedente con le autorizzazioni sudo .

    
risposta data chronitis 18.11.2013 - 11:28
64

sudo bang bang è un comando molto utile quando si lavora in Command Line Interface.

Alcune distribuzioni Linux ti fanno accedere come utente anziché come amministratore.

Quindi, per fare qualcosa da un punto di vista amministrativo, devi procedere con il comando sudo (Super User DO), che dice al sistema "lo farai, perché l'ho detto." / bang-bang (! = bang) è fondamentalmente una scorciatoia che puoi usare per ripetere il comando precedente.

Quindi, lo scenario tipico è che provi un comando, e restituisce un messaggio dicendo che devi essere un amministratore per farlo. Quindi, puoi digitare sudo per eseguire quel comando come superutente / admin, oppure puoi digitare sudo !! dove !! dice al sistema di usare il comando precedente che è stato tentato. UfH

Ci sono molti altri bang-command. Per un elenco di queste e spiegazioni su cosa sono, dai un'occhiata a Linux Bang Commands , vedi anche Storia di Bash e comandi bang

    
risposta data Mitch 18.11.2013 - 11:31
38

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

sudo !!

!! prende l'ultimo comando di esecuzione.

Ad esempio:

apt-get update

L'output sarà,

  

E: impossibile aprire il file di lock / var / lib / apt / lists / lock - open (13: autorizzazione negata)
  E: impossibile bloccare la directory / var / lib / apt / liste /
  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 comando sudo !! , 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]

Ciò significa che !! parte prende il comando di esecuzione precedente apt-get update e la parte precedente sudo rende il comando da eseguire con i diritti di superutente.

E come il sudo !! esegue il comando precedente con i privilegi di superutente, normalmente tutti i comandi che abbiamo immesso sul terminale sono memorizzati in command history . Esegui il comando history sul terminale, mostra tutti i comandi inseriti. La parte !! nella sudo !! cattura l'ultimo comando memorizzato nella cronologia dei comandi e l'intero sudo !! esegue l'ultimo comando con i privilegi di amministratore.

Alcuni altri comandi bang sono spiegati in questo post del blog .

    
risposta data Avinash Raj 18.11.2013 - 12:05
13

Ci sono due parti per la risposta: !! e sudo

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

$ 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 della presenza di !! , ma vedrà solo la riga di comando precedente. (A differenza di altre espansioni, l'espansione della cronologia avviene prima che un comando venga salvato nella cronologia, che invece di !! la riga di comando sostituita verrà salvata nella cronologia.)

Il comando sudo 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 ).

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

Il motivo per cui sudo può eseguire altri comandi come root (o un altro utente) è che il binario sudo ( /usr/bin/sudo ) ha il bit setuid impostato nella sua autorizzazione e appartiene a root. Qualsiasi eseguibile (binario) con setu 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 quale utente è autorizzato a 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 battitura. In entrambi i casi sudo vede solo mount /dev/sdb1 /mnt e lo esegue con i permessi di root.

    
risposta data Adaephon 21.11.2013 - 00:28
5

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

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

  1. Ti viene mostrato il comando completo con il testo sostituito.

    Ad esempio, se il tuo comando era lshw -c video ed esegui sudo !! next, il comando dopo l'espansione della cronologia è sudo lshw -c video .

  2. Questo comando viene eseguito.

Normalmente questi due passaggi si verificano senza interruzioni e senza alcuna possibilità di interazione con l'utente, perché shopt histverify non è impostato per impostazione predefinita ( shopt -u histverify ).

Tuttavia, se abiliti 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 avessi digitato quel testo tu stesso, con il cursore alla fine, ma non hai ancora eseguito il comando.
  2. Tu, utente, devi quindi premere Invio per eseguire il comando. Oppure puoi modificare il comando, cancellarlo ( Ctrl + C ), ecc. Nota che questo non è un prompt speciale, ma un normale prompt primario. È davvero come se tu stessi scrivendo il testo da solo.

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

Se l'opzione histverify di shell è abilitata , l'espansione della cronologia è diversa da molte altre espansioni di shell. Altre espansioni di shell non mostrano il comando espanso prima dell'esecuzione. A differenza di altre espansioni, che devono essere utilizzate sia in modo interattivo che non interattivo (ad esempio, in uno script di shell), l'espansione della cronologia viene quasi sempre utilizzata in modo interattivo.

    
risposta data Eliah Kagan 23.04.2015 - 19:47
3

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

È molto utile nei casi in cui si dimentichi di mettere sudo prima di un comando che lo richiede o si ottiene il permesso negato o qualcosa del genere basta fare

sudo !!
e il gioco è fatto.     
risposta data tapananand 21.11.2013 - 20:09
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ì.)

    
risposta data Farimah 18.11.2013 - 20:49

Leggi altre domande sui tag