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 sudo
comando 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 è sudo
possibile 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 /mnt
e lo esegue con i permessi di root.