GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Eine Reihe von Befehlen mit einem Sudo ausführen?

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 kann
sudo !!

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!

Verwandte:Kann sed neue Zeilenzeichen ersetzen?

¹ 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.


Linux
  1. Wie ordnet man einen Vim-Befehl zu, um Bash-Befehle basierend auf Os auszuführen?

  2. Ausführen Kombinieren Sie mehrere Linux-Befehle in einer Zeile

  3. Wie führe ich einen Bash-Befehl mit sudo-Berechtigungen in Java aus?

  4. Führt ein Shell-Skript in der aktuellen Shell mit sudo-Berechtigung aus

  5. Führen Sie zwei Befehle mit docker exec aus

Cheat Sheet für Linux-Befehle:Mit Beispielen

Nginx-Befehle, die Sie kennen sollten

Nmap-Befehle mit Beispielen

RPM-Befehle in Linux mit Beispielen

Grundlagen der Linux-Befehlszeile:sudo

Behandeln Sie den Zeilenumbruch mit Fold- und FMT-Befehlen im Linux-Terminal