Wenn ich beispielsweise eine Datei erstellen und Text in einer Zeile eingeben möchte, kann ich die Ausgabe mithilfe von >
in eine Datei umleiten Betreiber:
echo "something" > /path/foobar
aber wenn ich keinen Zugriff auf den Ordner /path/
habe und sudo-Berechtigungen benötigen. Wie kann ich denselben Befehl wie ein normaler Benutzer mit sudo-Rechten ausführen?
Ich habe es versucht
sudo echo "something" > /path/foobar
aber das funktioniert nicht, weil das sudo nur für das edit
zählt aber nicht für den rechten Teil
des >
Sicher, ich konnte vorher mit sudo su
root werden oder verwenden Sie tee
stattdessen:
echo "something" | sudo tee /path/foobar
Aber ich würde gerne eine Lösung finden, wo ich mit der letzten Zeile als Ersatz via
arbeiten kannsudo !!
Gibt es keine Möglichkeit, die letzte Zeile zu „recyceln“ und einfach sudo
hinzuzufügen vorne?
Akzeptierte Antwort:
Sie können nicht einfach sudo
einfügen vor einem Shell-Befehl müssen Sie eine Shell aufrufen, um diesen Befehl erneut auszuwerten (z. B. Variablen erweitern, Dateien für Umleitungsoperatoren öffnen usw.). Das ist also
sudo bash -c !!
außer dass das nicht ganz funktioniert, weil !!
interpoliert den Text des vorherigen Befehls, Sonderzeichen und alles. Sie müssen den Text des Befehls als Zeichenfolge abrufen und als Argument an sh
übergeben . Glücklicherweise ist fc
von bash builtin ermöglicht Ihnen das¹.
sudo bash -c "$(fc -ln -1)"
Oder um sicherzugehen, dass Sie dieselbe Bash-Version aufrufen, die gerade ausgeführt wird:
sudo "$BASH" -c "$(fc -ln -1)"
Beachten Sie, dass der Befehl, da er in einem separaten Shell-Prozess ausgeführt wird, Umgebungsvariablen erbt (nur diejenigen, die sudo
bewahrt, wohlgemerkt), aber keine Shell-internen Variablen. Shell-Optionen (z. B. kshglob
) und andere Einstellungen beginnen ebenfalls mit der Standardeinstellung.
Derselbe Befehl² funktioniert in zsh und ksh, obwohl ATT ksh93 sowohl den first
und last
Nummer, die an fc
übergeben werden soll ³ (funktioniert auch in bash, zsh und pdksh/mksh):
sudo zsh -c "$(fc -ln -1)"
sudo ksh -c "$(fc -ln -1 -1)"
sudo "$0" -c "$(fc -ln -1 -1)"
Mit $0
die ausführbare Datei der laufenden Shell festzulegen, funktioniert nur, wenn die Shell über den $PATH aufgerufen wurde und sich der $PATH nicht geändert hat, oder über einen absoluten Pfad.
Hier ist eine andere Methode in zsh, die etwas klarer, aber länger ist:
sudo zsh -c $history[$[HISTCMD-1]]
Ein letztes Wort der Warnung:sudo
ist für potenziell gefährliche Befehle. Machen Sie es sich nicht zu einfach!
¹ Es gibt etwas zusätzlichen Leerraum am Anfang und die Befehlsersetzung entfernt Zeilenumbrüche am Ende, aber die Syntax der Shell kümmert sich nicht darum.
² Ich glaube nicht, dass zsh oder ksh so etwas wie $BASH
von bash haben; $0
funktioniert nur, wenn es sich um einen absoluten Pfad handelt oder wenn er keinen Schrägstrich enthält und sich der Suchpfad des Befehls nicht geändert hat.
³ fc
ist ein Alias für hist
in ATT ksh, aber das ist genauso gut.