Führen Sie denselben Befehl erneut aus, jedoch als root

117

Wenn ich einen Befehl ausführe, merke ich manchmal nicht, dass ich ihn als Superuser ausführen musste, um über ausreichende Berechtigungen zu verfügen.

Gibt es eine Möglichkeit, denselben Befehl erneut auszuführen, aber als Superuser?

Trufa
quelle

Antworten:

196

Der einfachste Weg ist zu laufen:

sudo !!

Dies wird den letzten Befehl ausführen, aber als Superuser.

Quelle .

Trufa
quelle
5
Ich fand das ziemlich nützlich und war vorher nicht darauf gestoßen (obwohl es allgemein bekannt sein mag). Ich konnte es auf der Website nicht finden und dachte, ich würde es selbst beantworten.
Trufa
30
Unabhängig davon führt die Ausführung !!Ihres vorherigen Befehls wie in gespeichert aus history. Darüber hinaus tun !-1, !-2und so führt auf den letzten Befehl, vorletzter Befehl ein , und so weiter. Praktisch!
Oaskamay
6
Abgesehen davon !<command>wird das letzte Event von ~/.bash_historydiesem Anfang an mit<command>
Radu Rădeanu
1
ctrl-r ist auch sehr nützlich. In Ihrem Verlauf wird rückwärts nach Befehlen gesucht, die Ihrer Eingabe entsprechen. Auf diese Weise können Sie den Befehl bearbeiten, bevor Sie ihn erneut
ausführen
4
Dieses blöde !Bash-Ding, von dem kopiert wurde, tcshhat mich öfter durcheinander gebracht, als es jemals nützlich gewesen ist. Doppelte Anführungszeichen schützen nicht vor der Interpretation von !. $ foo "!bar"-> !bar: event not found.
Kaz
70

Für den Fall, dass Sie nicht mehr weiterkommen möchtenBildbeschreibung hier eingeben

Antwort : Sie geben sudo !!direkt danach ein, um den vorherigen Befehl mit erweiterten Berechtigungen zu wiederholen.

edit: Bild gefunden via reddit , und es ist eine Parodie des originalen xkcd-Comics von Randall Munroe.

wim
quelle
3
Bitte führen Sie hier in den Kommentaren keine Pro-oder-gegen-Konversation. Wenn Sie die Vorzüge besprechen möchten, verwenden Sie bitte Meta. Vielen Dank.
fossfreedom
17

Sie können versuchen, mit der Aufwärtspfeiltaste durch Ihre alten Befehle zu scrollen und sie umzuschreiben / zu ändern und die sudovor ihnen hinzuzufügen . (Die Home-Taste über den Pfeiltasten setzt die Position an den Anfang.)

Ich mag die sudo !!Idee nicht, weil man manchmal einen anderen Befehl dazwischen hinzufügt und sich nicht mehr erinnert.

Xylol
quelle
1
Glücklicherweise wird sudo !!die Shell dann erweitert, !!sodass Sie sehen können, welcher Befehl ausgeführt werden soll. Daher kann es irritierend sein, Strg-C zu drücken und den richtigen Befehl zu finden, aber Sie werden zumindest nicht überrascht.
Reid
4
@Reid Wird erst erweitert, nachdem Sie die Eingabetaste gedrückt haben. Wenn Sie sich in diesem Fenster befinden, in dem Sie Ihr Kennwort nicht erneut eingeben müssen, wird es ohne Bestätigung ausgeführt. +1, um den Verlauf zu verwenden, anstatt ihn blind zu verwenden!!
Izkata
5
@ Izkata: Ich nehme an, das ist wahr. Ich benutze zsh, tippe also einfach sudo !!<TAB>und es wird automatisch !!vervollständigt. Bash kann die Geschichte mit M-^(für mich Alt + Shift + 6) erweitern, aber das ist weniger fließend (Sie könnten dies jedoch neu binden). Es gibt auch shopt -s histverifyeine Option, mit der Sie die Verlaufserweiterung anzeigen und bearbeiten können, wenn Sie die Eingabetaste drücken.
Reid
1
Ich dachte mehr an die Situation, in der ich einen Befehl eingegeben habe, der Befehl zurückgab, dass die Erlaubnis verweigert wurde, und ich weiß, dass ich genau denselben Befehl erneut ausführen möchte, aber als sudo, den Vorgang des Drückens, nach Hause, der Eingabe von sudo und viel Gefühl langsamer zu mir. So habe ich es schon immer gemacht und es fühlte sich einfach ineffizient an.
Trufa
@Reid: shopt -s histverifyhilft kein bisschen. Die meisten Leute werden sich daran gewöhnen, Enterzweimal zu schlagen . Zu diesem Zeitpunkt sind sie noch zu spät, um zu überprüfen, was passiert ist.
Frank Kusters
13

Ich füge nur eine Alternative hinzu: So kurz wie das Tippen sudo !!und flexibler:

Up-arrow (once, or until you find the command you want to sudo/edit, if it's older)
ctrl+A   (place cursor at beginning of line)
"sudo "
Enter

Es ist genau die gleiche Anzahl von Tastenanschlägen (ich zähle "Strg + A" als einen ...), aber wenn Sie "Pfeil nach oben" hinzufügen, können Sie dies mit jedem Befehl in Ihrem Verlauf tun.

Olivier Dulac
quelle
1
Strg + A stammt aus den Emacs-Bindungen, Sie können auch die vi-Bindungen ( set -o vi) verwenden. Dann können Sie Escape (in den Befehlsmodus wechseln) und dann 'I' (Großbuchstabe 'i', am Zeilenanfang einfügen).
Gerhard Burger
1
@GerhardBurger: Ich weiß, aber seltsamerweise liebe ich vi (besonders vim) für die Bearbeitung mehrzeiliger Dokumente, aber ich bevorzuge die Bindung von Emacs in der Shell (wenn ich in der Shell vom Befehlsmodus zum Bearbeitungsmodus wechseln muss, nicht macht wirklich Sinn, imo, und die Verknüpfungen von Emacs sind genug für den täglichen Gebrauch, auch wenn weniger leistungsstark)
Olivier Dulac
Richtig, ich habe es nur der Vollständigkeit
Gerhard Burger
@GerhardBurger: Über vi-Modes "/", reguläres (Emacs-Binding) Bash ist es auch sehr praktisch, frühere Befehle zu finden, indem Sie ein paar Buchstaben und dann "Strg + R" eingeben, bis Sie es finden
Olivier Dulac
7

Hierfür gibt es verschiedene Möglichkeiten

  • Geben Sie einfach den Befehl erneut ein und fügen Sie ihn sudovor dem Befehl hinzu

  • Drücken Sie Up arrowden letzten Befehl zu bekommen und legte sudovor ihm.

  • Eingeben sudo !!

Das wird !!zum zuletzt eingegebenen Befehl erweitert. Sie können ähnliche Dinge mit anderen Dingen in der Befehlszeilenhistorie tun, siehe hier

user162424
quelle
7

Diese Frage hätte in "Den gleichen Befehl ausführen, aber mit einigen Änderungen " verallgemeinert werden können , da eine der brillanten Entwurfsentscheidungen in Unix darin besteht, dass das, was einmal in der Shell implementiert ist, von jedem Befehl genutzt werden kann, der von der Shell aus aufgerufen wird.

Mit anderen Worten, dieser Trick gilt nicht nur für sudo:

  • Wiederholen Sie den vorherigen Befehl als Superuser ( sudo !!)
  • Wiederholen Sie den vorherigen Befehl und setzen Sie die Zeit fest ( time !!)
  • Wiederholen Sie den vorherigen Befehl mit einer anderen Umgebung ( env A=b B=z !!)
  • Wiederholen Sie den vorherigen Befehl ( !!)

Die Verlaufserweiterung (auch als Verlaufsersetzung bezeichnet) ist nur eine Shell-Funktion, die das Wiederholen früherer Befehle erleichtert (mit weniger Tastenanschlägen). Überprüfen Sie Ihre Shell-Manpage auf history expansion. Es werden viele weitere Tricks und Verknüpfungen beschrieben, die Sie beispielsweise mit der Geschichte ausführen können:

Sie können sich auf frühere Befehle durch Nummer beziehen:

!55                 # repeat command number 55
!-1                 # repeat the previous command, alias for !!
!-2                 # repeat the command before the previous command

Sie können in früheren Befehlen auf einzelne Wörter verweisen:

some-command !$     # run some-command on the last arg of previous command

Sie können auch suchen, bevor Sie Folgendes wiederholen:

!?awk               # repeat the last command including the string 'awk'

Sie können den Verlauf durchsuchen und etwas durch etwas anderes ersetzen:

!?awk?:s/str1/str2/  # repeat previous command matching 'awk' replacing str1 by str2

Und vieles mehr, da Sie die Befehlsauswahl, die Argumentauswahl, das Suchen und Ersetzen unabhängig voneinander kombinieren können.

Die Manpage Ihrer Shell (in diesem Fall man bash) ist Ihr Freund.

Arielf
quelle
1
brillant! das sollte die akzeptierte Antwort sein.
Eliran Malka
5

Ich verwende zsh anstelle von bash und habe dies in meinem ~/.zshrc, also drücke Alt+ Sfüge sudoam Anfang der Kommandozeile ein:

insert_sudo () { zle beginning-of-line; zle -U "sudo " }
zle -N insert-sudo insert_sudo
bindkey "^[s" insert-sudo

Leider konnte ich keine Möglichkeit finden, dasselbe in bash zu tun.

Aufnäher
quelle
3
Sie können dies auch in Bash mit GNU Readline tun: Fügen Sie Ihrer hinzu, ~/.inputrc "\es":"\C-asudo "und Sie werden an den Anfang einer langen Zeile verschoben, und sudo wird beim Drücken von am Anfang der Zeile eingefügt alt-s. Starten Sie das Terminal neu oder lesen Sie ~/.inputrces erneut, damit es funktioniert.
2

Wenn Sie es in einem Alias ​​tun möchten, müssen Sie alias redo='sudo $(history -p !!)'aus irgendeinem Grund verwenden.

Aaron Franke
quelle
1
su -c "!!"

Wenn Sie keine Berechtigung haben, mit sudo als root angemeldet zu sein, wurde das sudo-Programm nicht auf dem System installiert.

Achu
quelle
1

So wie ich es mag:

  • Pfeiltaste nach oben
  • Zuhause
  • "sudo"
  • Eingeben

Aber es könnte einfacher sein, einfach "sudo !!" zu machen, es liegt an Ihnen.

Farid El Nasire
quelle