Die Antwort besteht aus zwei Teilen: !!
undsudo
!!
ist Teil der Funktionalität der Shell (im Falle von Ubuntu ist dies wahrscheinlich bash, aber auch andere Shells wie zsh oder csh unterstützen dies), die als "history expansion" bezeichnet wird. Es verhält sich ähnlich wie andere Erweiterungen, da die Shell den 'Platzhalter' zu einer Reihe von Wörtern erweitert. Während foo*
auf eine Liste aller Dateien, die mit 'foo' beginnen, !!
erweitert wird, wird auf den Inhalt der vorherigen Befehlszeile erweitert.
$ echo foobar
foobar
$ echo !!
echo foobar
$ !!
echo foobar
Wie bei anderen Erweiterungen wird dies vollständig von der Shell ausgeführt. Wenn Sie also !!
nach einem anderen Befehl einen Befehl eingeben, wird diesem Befehl nicht bewusst, dass es einen gab !!
, sondern nur die vorherige Befehlszeile angezeigt. (Im Gegensatz zu anderen Erweiterungen erfolgt die Verlaufserweiterung, bevor ein Befehl im Verlauf gespeichert wird, dh, statt !!
der ersetzten Befehlszeile wird er im Verlauf gespeichert.)
Der sudo
Befehl ermöglicht die Ausführung von Befehlen als anderer Benutzer, sofern die Berechtigungen von der Sicherheitsrichtlinie gewährt werden (Standardeinstellung ist in konfiguriert /etc/sudoers
).
Standardmäßig bleibt das root-Passwort in Ubuntu nicht gesetzt. Zur Durchführung von Systemadministrationsaufgaben werden dem während der Installation erstellten Benutzer Sudo-Rechte gewährt. Dieser Benutzer kann jetzt einen beliebigen Befehl auf der Shell als root ausführen, indem er diesen einfach voranstellt sudo
. Einige GUI-Programme verwenden ebenfalls den sudo-Mechanismus, zum Beispiel die Paketverwaltung.
Der Grund, warum sudo
andere Befehle als root (oder als anderer Benutzer) ausgeführt werden können, ist, dass in sudo binary ( /usr/bin/sudo
) das setuid-Bit in seiner Berechtigung gesetzt ist und zu root gehört. Jede (binäre) ausführbare Datei mit gesetztem setuid-Bit wird mit den Berechtigungen ihres Besitzers ausgeführt. Dies bedeutet, dass sudo effektiv mit Root-Berechtigungen ausgeführt wird, unabhängig davon, welcher Benutzer es tatsächlich aufgerufen hat. Nur die internen Sicherheitsrichtlinien von sudo verwalten, welcher Benutzer was darf und verhindern, dass willkürliche Benutzer willkürliche Dinge tun.
Also im Falle sudo !!
dieses Mittels
$ mount /dev/sdb1 /mnt
mount: only root can do that
$ sudo !!
ist im Grunde identisch mit
$ mount /dev/sdb1 /mnt
mount: only root can do that
$ sudo mount /dev/sdb1 /mnt
nur weniger tippen. In beiden Fällen sieht sudo es nur mount /dev/sdb1 /mnt
und führt es mit root-Berechtigungen aus.