Wenn ich zum Beispiel eine Datei erstellen und Text in einer Zeile eingeben möchte, kann ich die Ausgabe mithilfe des >
Operators in eine Datei umleiten :
echo "something" > /path/foobar
Aber wenn ich keinen Zugriff auf den Ordner habe /path/
und Sudo-Berechtigungen benötige, 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 geht nicht, denn das sudo zählt nur für den edit
, nicht aber für den richtigen teil
des sudo>
Klar, ich könnte vorher mit root werden sudo su
oder tee
stattdessen verwenden:
echo "something" | sudo tee /path/foobar
Ich würde aber gerne eine Lösung finden, bei der ich mit der letzten Zeile als Ersatz über arbeiten kann
sudo !!
Gibt es nicht eine Möglichkeit, die letzte Zeile zu "recyceln" und einfach voranzustellen sudo
?
bash
sudo
command-history
rubo77
quelle
quelle
alias sudo !!
?Antworten:
Sie können nicht einfach
sudo
vor einem Shell-Befehl bleiben, sondern müssen eine Shell aufrufen, um diesen Befehl erneut auszuwerten (z. B. Variablen erweitern, Dateien für Umleitungsoperatoren öffnen usw.). So das istaußer dass dies nicht ganz funktioniert, weil
!!
der Text des vorherigen Befehls, Sonderzeichen und alles interpoliert. Sie müssen den Text des Befehls als Zeichenfolge abrufen und als Argument an übergebensh
. Glücklicherweise bashfc
builtin können Sie that¹ tun.Oder, um sicherzugehen, dass Sie dieselbe Version von bash aufrufen, die gerade ausgeführt wird:
Beachten Sie, dass der Befehl, da er in einem separaten Shell-Prozess ausgeführt wird, Umgebungsvariablen (nur diejenigen,
sudo
die mind beibehalten), aber keine internen Shell-Variablen erbt . Shell-Optionen (z. B.kshglob
) und andere Einstellungen beginnen ebenfalls mit der Standardeinstellung.Der gleiche Befehl² funktioniert in zsh und ksh, obwohl ATT ksh93 die Übergabe von
first
undlast
number anfc
³ erfordert (was auch in bash, zsh und pdksh / mksh funktioniert):Das Festlegen
$0
der ausführbaren Datei der laufenden Shell funktioniert nur, wenn die Shell über $ PATH aufgerufen wurde und sich $ PATH nicht geändert hat oder über einen absoluten Pfad.Hier ist eine andere Methode in zsh, die etwas klarer, aber länger ist:
Ein letzter Warnhinweis: bezieht
sudo
sich auf potenziell gefährliche Befehle. Mach es dir nicht zu einfach, es zu benutzen!¹ Am Anfang steht ein zusätzliches Leerzeichen, und die Befehlsersetzung entfernt am Ende Zeilenumbrüche, aber die Syntax der Shell kümmert sich nicht darum.
² Ich glaube nicht, dass zsh oder ksh so etwas wie bashs haben
$BASH
.$0
Funktioniert nur, wenn es sich um einen absoluten Pfad handelt oder wenn er keinen Schrägstrich enthält und sich der Befehlssuchpfad nicht geändert hat.³ ist ein Alias für in ATT ksh, aber das ist genauso gut.
fc
hist
quelle
Wenn Sie den gleichen Befehl mit sudo wiederholen möchten !! Nach einem Befehl wie diesem:
Mit der globalen Ersetzungssyntax rufen Sie den Befehl auf:
Verwenden Sie ein Leerzeichen nach dem Parameter -a .
Dies ist das Äquivalent zu sudo !! Dies hilft Ihnen jedoch, die sudo-Einschränkungen für <und> zu umgehen. Weil sudo die Verwendung von [<,>] nicht zulässt.
Um die Sudo-Einschränkungen für Weiterleitungen im Allgemeinen zu umgehen, können Sie sie folgendermaßen verwenden:
Mit dem Befehl tee können Sie von der Standardeingabe lesen und in die Standardausgabe und -dateien schreiben
Wenn Sie den Befehl wiederholen und einen Text an die Datei anhängen möchten, enthält der Befehl tee die Option -a zum Anhängen. So konnte man sich mit an den Befehl erinnern
und der Text wird in der Datei angehängt
Beispiel:
quelle
-a
wirklich gebraucht?>
überschreibt eine Datei,tee -a
wird angehängt, was sein würde>>
Es scheint so einfach zu sein wie
sudo sh -c "!!"
:quelle
echo "foo bar"
was was werdensh -c "echo "foo bar""
würde, und drucken Sie es einfachfoo
ausfoo bar
.sudo sh -c '!!'
stattdessen versucht, ob Ihr Befehl, aber das funktioniert auch nichta=b
und dannecho "$a" >file
und dannsudo sh -c '!!'
würde es erweitern, umsudo sh -c 'echo $a >file'
die eine leere Zeile stattb
in zu druckenfile
.sudo
einer Root-Shell und anschließendes Kopieren und Einfügen des Befehls wäre am nächsten, schlägt jedoch fehl, wenn für den Befehl Variablen erwartet wurden, die in Ihrer Nicht-Root-Shell festgelegt wurden. Die Verwendung vonsudo sh -c "!!"
funktioniert gut für einfache Befehle, ist aber für komplexe voll. Ich denke, der beste Rat ist, nicht zu erwarten, dass es einen Befehl gibt, der 100% der Zeit funktioniert - lernen Sie einige mögliche Lösungen und wenden Sie jeden an, wenn er am besten passt.