2017-06-28 4 views
0

in einem Bash-Skript Ich versuche, einen Text mit Echo mit Sudo non interactive in eine Datei gedruckt umleiten. Aber mir ist nicht klar, wie es geht.Bash-Skript: sudo keine interaktive Echo-Umleitung zu einer Datei

Ich habe versucht, mit diesem Code:

echo $sudopass| sudo -S echo "user ALL=(ALL) NOPASSWD:ALL" >  /etc/sudoers.d/ansible 
+0

Ist Ihre Frage zu Berechtigungen? Sie sollten den tatsächlichen Fehler erwähnen, den Sie erhalten. –

Antwort

1

Output-Umleitung wird durch erhöhte sudo Berechtigungen nicht betroffen. Der Teil, den Sie sudo sind, ist die echo, nicht die Umleitung der Ausgabe dieses Befehls.

Das geschieht immer noch mit der Erlaubnis Ihres derzeitigen Benutzers.

Sie benötigen also eine Möglichkeit, eine Zeile an eine Datei anzufügen, die keine Ausgabeumleitung beinhaltet.


Hinweis:frühere Version dieser Antwort präsentiert sed als sed balks entfernt werden, wenn die Zieldatei leer oder nicht-existent ist. Da ich den Kern der Antwort intakt halten wollte - "wie man die Ausgabeumleitung vermeidet" - habe ich Anweisungen für die Verwendung von vi für den gleichen Zweck hinzugefügt.


Jeder POSIX-konformes System benötigt die vi/ex Editor haben. (Ein moderner Linux-Maschinen in der Regel einen Link starten Vim in Kompatibilitätsmodus.) Sie können "remote-control" ex/vi/Vim über die Befehlszeile: (. Dies ist ohne sudo Teil für Klarheit)

vi -es -c "normal! G" -c "normal! ouser ALL=(ALL) NOPASSWD:ALL" -c "x" /etc/sudoers.d/ansible 

Erläuterung:

  • -e beginnt vi in "ex-Modus". (Entspricht dem Aufruf ex.)
  • -s bedeutet "leise" - keine Eingabeaufforderungen, keine Nachrichten.
  • -c übergibt einen Befehl an den Editor, der ausgeführt wird, sobald die erste Datei gelesen wurde.
  • "normal! G" bringt zuerst den Editor in "normalen Modus" - das ist, was Sie in selbst finden würden, wenn Sie interaktiv gestartet vi; ex ist standardmäßig im "Befehlsmodus" (als ob Sie : in vi eingegeben hätten). Die G bewegt den Cursor auf die letzte Zeile.
  • "normal! o..." wieder aktiviert normalen Modus, fügt eine Zeile nach der aktuellen Zeile hinzu und aktiviert "Einfügemodus". Der Rest der Zeichenfolge wird wörtlich eingegeben.
  • "x" speichert die Datei und beendet den Editor.

Der Zeilenbefehl einschließlich des sudo Teil:

echo $sudopass | sudo -S vi -es -c "normal! G" -c "normal! ouser ALL=(ALL) NOPASSWD:ALL" -c "x" /etc/sudoers.d/ansible 
+0

Vielen Dank! Funktioniert perfekt diesen Code. –

+0

Ich vergesse, dass die Datei "/etc/sudoers.d/ansible" leer ist und diese sed commad benötigt irgendeinen Inhalt um den neuen Text anzuhängen. Ich habe diese Reihenfolge gefunden, um die Umleitung mit sudo zu verwenden, aber ich bin mir nicht sicher, ob die beste Idee ist, einen sh-Befehl mit sudo innerhalb des Skripts aufzurufen oder wenn es eine elegantere Möglichkeit gibt, Code in eine leere Datei mit sudo non interactive einzufügen: > sudo -S sh -c 'echo "#ANSIBLE-Eintrag> /etc/sudoers.d/ansible"' –

+0

@ jhd00023: Ja, 'sed' wirkt, wenn die Zieldatei keinen vorherigen Inhalt hat. Ich habe die Antwort geändert, um stattdessen 'vi' zu verwenden (um die ursprüngliche" Keine Umleitungen mit 'sudo'" -Nachricht zu erhalten). Ihre Art, den gesamten Befehl * inklusive * Umleitung zu 'sh -c' zu übergeben, funktioniert natürlich auch. – DevSolar