Was bedeutet "!!" in "sudo !!"?

64

Ich bin ein Benutzer von Ubuntu mit wenig Erfahrung und habe verwendet sudo.

Was macht sudo !!und wie?

RamHS
quelle
7
Duplikat von, außer von der anderen Seite: Führen Sie denselben Befehl erneut aus, jedoch als sudo
ein CVn
6
@WarrenHill er will nicht das "wie", sondern das "was" und "wie". Er fragt mehr nach dem !!Teil des Befehls.
Braiam
1
@Nakilon sollte nicht sein. Diese Frage stellt sich die Frage, was die !!machen und wie. Der andere möchte eine Methode, um dies zu tun.
Braiam
@ MichaelKjörling meintest du verwandt oder?
Braiam
2
@Braiam Eigentlich meinte ich duplizieren; Die beiden Antworten mit den höchsten Stimmen erklären genau, was sudo !!funktioniert, und es gibt zwei Antworten, die genau erklären, was !!funktioniert.
ein Lebenslauf vom

Antworten:

74

!!in bash ist ein Alias ​​für den vorherigen Befehl (siehe Event Designators ). Daher wird der vorherige Befehl mit sudoBerechtigungen erneut ausgeführt.

Chronitis
quelle
15
Hinweis: !Befehle sind normalerweise nicht in Bash-Skripten verfügbar (nur in interaktiven Sitzungen). Sie können mit deaktiviert werden set +o histexpand.
Benoit
64

sudo bang bang ist ein sehr nützlicher Befehl, wenn Sie in der Befehlszeilenschnittstelle arbeiten.

In einigen Linux-Distributionen müssen Sie sich als Benutzer und nicht als Administrator anmelden.

Um etwas Administratives zu tun, müssen Sie den Befehl mit sudo(Super-User DO) ausführen, der dem System mitteilt, dass Sie dies tun werden, weil ich es gesagt habe. / bang-bang (! = bang) ist im Grunde eine Verknüpfung, mit der Sie den vorherigen Befehl wiederholen können.

Ein typisches Szenario ist also, dass Sie einen Befehl versuchen und eine Meldung zurücksendet, dass Sie ein Administrator sein müssen, um dies zu tun. Sie können also entweder eingeben sudo, um diesen Befehl als Superuser / Administrator auszuführen, oder Sie können eingeben, sudo !!wo !!das System angewiesen wird, den vorherigen Befehl zu verwenden, der versucht wurde. UfH

Es gibt viele andere Knallbefehle. Eine Liste dieser Befehle und Erklärungen zu ihrer Funktionsweise finden Sie unter Linux-Befehlssprung. Weitere Informationen finden Sie unter Bash-Verlauf und Befehlssprung

Mitch
quelle
12
Es ist auch ein sehr gefährlicher Befehl, wenn Sie nicht 100% sicher sind, was Ihr vorheriger Befehl war. Es ist fast immer sicherer, zuerst den Aufwärtspfeil und dann die Starttaste zu drücken und dann sudodie Befehlszeile einzugeben.
Shadur
3
@Shadur Normalerweise war Ihr vorheriger Befehl vor ungefähr 1 Sekunde. Der normale Anwendungsfall ist der in der Antwort beschriebene: Sie vergessen sudoetwas und erhalten eine Fehlermeldung, und Sie möchten sudoes sofort
Michael Mrozek
1
@Braiam: CLI ist eine Abkürzung. Verstoß gegen Gemeinschaftsregeln! Attacke! Erneut bearbeiten!
Indian
4
sudobedeutet nicht , „Super-User tun“, es geht so tut einen Befehl , als ob ich getan hatte su(su Sinn Schalter Benutzer [und nicht die Super - User]); Das heißt, Sie können sudo-Befehle als jeder Benutzer ausführen, nicht nur als root ( -uswitch). Gleiches gilt fürsu [user] [-c command]
ssice 18.11.13
1
@Mitch steht suaber nicht für so etwas. Siehe linux.die.net/man/1/su , gnu.org/software/coreutils/manual/html_node/su-invocation.html , linfo.org/su.html . Es sollte Ersatzbenutzer bedeuten .
ssice
38

Der bang bang (!!)Befehl ist eine Verknüpfung, mit der Sie den zuvor in Ihr Terminal eingegebenen Befehl wiederholen und ausführen können . Dieser Befehl ist sehr nützlich, wenn Sie vergessen haben, dass Sie Administratorrechte benötigen, um eine bestimmte Aktion auszuführen, und Sie können ihn mit Superuser-Rechten wiederholen, indem Sie einfach Folgendes eingeben:

sudo !!

!! schnappt sich den letzten Befehl.

Zum Beispiel:

apt-get update

Die Ausgabe wird sein,

E: Sperrdatei / var / lib / apt / lists / lock - open konnte nicht geöffnet werden (13: Berechtigung verweigert)
E: Verzeichnis / var / lib / apt / lists /
konnte nicht gesperrt werden E: Sperrdatei / var / lib / dpkg / lock - open (13: Berechtigung verweigert)
E: Das Administrationsverzeichnis (/ var / lib / dpkg /) kann nicht gesperrt werden. Sind Sie root?

Wenn wir danach den sudo !!Befehl ausführen , wird die Ausgabe sein

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]

Das bedeutet, dass !!part den vorherigen Ausführungsbefehl aufnimmt apt-get updateund der vorherige sudoTeil den Befehl mit Superuser-Rechten ausführt.

Und wie das sudo !!Ausführen des vorherigen Befehls mit Superuser-Rechten bedeutet, werden normalerweise alle auf dem Terminal eingegebenen Befehle im command history.Run- historyBefehl auf dem Terminal gespeichert. Es werden alle von Ihnen eingegebenen Befehle angezeigt. Der !!Teil in der sudo !!packt den zuletzt gespeicherten Befehl im sudo !!befehlshistorie läuft und das ganze den letzten befehl mit adminrechten.

Einige andere Knallbefehle werden in diesem Blog-Beitrag erklärt .

Avinash Raj
quelle
3
Ich bin überrascht zu sehen, dass es wieder von "Bang Bang" handelt. Ich dachte einmal wäre genug.
kiri
1
+1 für weitere Beispiele für Knallbefehle.
WernerCD
1
@Rmano Zumindest in Bash, und ich erwarte , dass alle Bourne-Stil Schalen mit Geschichte Unterstützung, mkdir LongDirectoryNameund cd !$müssen separat an die Arbeit ausgestellt werden, es sei denn , LongDirectoryNamedas letzte Wort des vorhergehenden Befehls haben passiert gewesen. Aus Gründen der Shell-Historie mkdir LongDirectoryName; cd !$ist dies ein Befehl. Verlaufsinteraktion mit !!, !^und !$verwenden Sie den letzten Befehl, den die Shell tatsächlich vollständig verarbeitet hat, bevor sie angezeigt wird !. Hier ist ein Beispiel. Wenn Sie ausführen, werden historySie feststellen, dass Befehle in einer Zeile, die durch verbunden ;ist, als ein Befehl gespeichert werden.
Eliah Kagan
@EliahKagan du hast recht! Falsche Infos gelöscht ...
Rmano
13

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 sudoBefehl 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 sudoandere 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 /mntund führt es mit root-Berechtigungen aus.

Adaephon
quelle
5

!!ist der syntaktisch einfachste und wahrscheinlich gebräuchlichste Ausdruck für die Historienerweiterung .

Wie Sie vielleicht bemerkt haben !!, führt bash nach dem Ersetzen des zuletzt ausgeführten Befehls zwei Dinge aus (in der Standardkonfiguration):

  1. Der vollständige Befehl mit dem ersetzten Text wird Ihnen angezeigt.

    Wenn Ihr Befehl beispielsweise lautete lshw -c videound Sie als sudo !!Nächstes ausführen , lautet der Befehl nach der Protokollerweiterung sudo lshw -c video.

  2. Dieser Befehl wird ausgeführt.

Normalerweise erfolgen diese beiden Schritte ohne Unterbrechung und ohne die Möglichkeit einer Benutzerinteraktion, da sie shopt histverifystandardmäßig deaktiviert sind ( shopt -u histverify).

Wenn Sie jedoch shopt histverify( shopt -s histverify) aktivieren, funktioniert die Verlaufserweiterung anders:

  1. Sie erhalten eine neue primäre Eingabeaufforderung mit dem automatisch eingegebenen erweiterten Text. Es ist, als hätten Sie diesen Text mit dem Cursor am Ende selbst eingegeben, aber den Befehl noch nicht ausgeführt.
  2. Sie als Benutzer müssen dann drücken Enter, um den Befehl auszuführen. Oder Sie können den Befehl bearbeiten, abbrechen ( Ctrl+ C) usw. Beachten Sie, dass dies keine spezielle Eingabeaufforderung ist, sondern eine reguläre primäre Eingabeaufforderung. Es ist wirklich so, als hätten Sie den Text selbst eingegeben.

(Beachten Sie, dass die histverify Shell-Option nur wirksam wird, wenn die readline-Bibliothek verwendet wird. Wenn Sie jedoch bash interaktiv auf einem Ubuntu-System oder einem anderen GNU / Linux-System verwenden, ist dies im Wesentlichen immer der Fall.)

Unabhängig davon, ob die histverifyShell-Option aktiviert ist oder nicht , unterscheidet sich die Verlaufserweiterung von vielen anderen Shell-Erweiterungen. Andere Shell-Erweiterungen zeigen den erweiterten Befehl nicht an, bevor er ausgeführt wird. Im Gegensatz zu anderen Erweiterungen, die sowohl interaktiv als auch nicht interaktiv verwendet werden sollen (z. B. in einem Shell-Skript), wird die Verlaufserweiterung fast immer interaktiv verwendet.

Eliah Kagan
quelle
3

! wird in Linux für geschichtsbezogene Verknüpfungen verwendet. Damit, !! Führt einfach den zuvor ausgeführten Befehl aus.

Dies ist sehr hilfreich, wenn Sie entweder vergessen haben, sudo vor einen Befehl zu setzen, der dies erfordert, oder wenn Sie die Berechtigung "Verweigert" erhalten, oder wenn Sie etwas Ähnliches tun

sudo !!
und du bist fertig.

Tapananand
quelle
0

!! Wiederholt den vorherigen Befehl und führt ihn aus. Mit sudo erhält der Befehl das Root-Privileg. (Es ist nicht in der Manpage? !! Ich kann es dort nicht sehen.)

Farimah
quelle
Für alle, die die Manpage suchen:man --pager='less -p "Event Designators"' bash
Sebi