Führen Sie mit einem Bash-Skript, das auf einem lokalen Computer ausgeführt wird, einen Befehl (mit Sudo-Berechtigungen) auf einem Remote-Server aus.

Führen Sie mit einem Bash-Skript, das auf einem lokalen Computer ausgeführt wird, einen Befehl (mit Sudo-Berechtigungen) auf einem Remote-Server aus.

Ausführen eines Befehls auf einem Remotesystem von einem lokalen Computer aus

Ich muss einen Befehl auf einem Remote-Lubuntu-22.04-System über eine SSH-Verbindung ausführen, ohne jedoch eine Shell zu öffnen.Diese Anweisung wird innerhalb eines Skripts ausgeführt.Das Skript wird auf meinem lokalen System ausgeführt (auf dem eine andere Ubuntu-Distribution installiert ist). Ich habe festgestellt, dass ich es erfolgreich ausführen kann, indem ich auf dem lokalen System das folgende Skript ausführe:

# define a variable which stored the password
MYPASSWORD='mypassword'

sshpass -p $MYPASSWORD ssh [email protected] "cp /home/myuser/file1 /path/to/dest/"

In dem von mir verwendeten Befehl sshpass(der auf meinem lokalen System installiert ist) wird die Eingabe des Kennworts für den Benutzer vermieden, das myuserzur Authentifizierung der SSH-Sitzung erforderlich ist.

Meine Bedürfnisse

Ich muss auch einen cpBefehl wie den vorherigen ausführen, aber das Ziel für die Datei ist ein Unterordner von /etcund dafür sind sudoBerechtigungen erforderlich. Das Skript sieht also so aus:

MYPASSWORD='mypassword'

sshpass -p $MYPASSWORD ssh [email protected] "cp /home/myuser/file1 /path/to/dest/"

sshpass -p $MYPASSWORD ssh [email protected] "sudo -S cp /home/myuser/file1 /etc/sub/folder/"

Wenn ich das Skript ausführe, gibt der letzte Befehl des Skripts die folgende Anfrage aus:

[sudo] password for myuser:

Daher stoppt das Skript seine Ausführung und wartet auf das sudoPasswort.
Ich will das nicht!

Ein Versuch von mir

Wenn ich den Befehl ausführe:

> echo mypassword | sudo -S -s cp /home/myuser/file1 /etc/sub/folder/

direktauf einem Terminal des Remote-Systemses funktioniert und kopiert, file1ohne /etc/sub/folder/nach dem sudoPasswort zu fragen.

Aber wenn ich den folgenden Befehl ausführeauf meinem lokalen System:

sshpass -p 'mypassword' ssh [email protected] "echo mypassword | sudo -S -s cp /home/myuser/file1 /etc/sub/folder/"

es funktioniert nicht!

Meine Frage

Gibt es eine Möglichkeit, die Eingabe des Passworts über sudodie Tastatur zu vermeiden? Ist es möglich, das Passwort automatisch zu versenden?

Antwort1

Ich habe einen Workaround/eine Lösung gefunden.

Durch die Verwendung einer Datei, die das Passwort vorübergehend speichert fürsudo

Ich habe das im lokalen System ausgeführte Skript durch Hinzufügen einiger der unten gezeigten Befehle geändert:

  • Erstellung einer Textdatei im Ordner des Remote-Systems durch den echoBefehl; die Datei heißt password.txtund enthält nur das Passwort ( "mypassword") für den Benutzer myuser.
  • die Datei password.txtdient dem Operator direkt als Eingabe für den sudoBefehl <.
  • Ausführung des Befehlssudo -S < /home/myuser/password.txt cp /home/myuser/file1 /etc/sub/folder/
  • Löschen der Datei /home/myuser/password.txt vom Remote-System

Diese Lösung wird in einer sicheren Entwicklungsumgebung verwendet, sodass keine Sicherheitsbeschränkungen verletzt werden.

Das neue Drehbuch

Mit diesen Anweisungen wird das im lokalen System ausgeführte Skript zu:

MYPASSWORD='mypassword'

# creation of the file password.txt on the home folder of the remote system
sshpass -p $MYPASSWORD ssh [email protected] "echo $MYPASSWORD > /home/myuser/password.txt"

# execution of the command which needs the sudo privileges (on remote system)
sshpass -p $MYPASSWORD ssh [email protected] "sudo -S < /home/myuser/password.txt cp /home/myuser/file1 /etc/sub/folder/"
# The '<' directs file passowrd.txt as input to sudo   ===========================

# deletion of the file password.txt
sshpass -p $MYPASSWORD ssh [email protected] rm /home/myuser/password.txt

Unterdrücken Sie die Ausgabe vonsudo -S

Ich habe eine weitere Verbesserung gefunden, die es ermöglicht, die Ausgabe ( [sudo] password for myuser:) des Befehls zu unterdrücken sudo -S, der von SSH an das lokale System gesendet wird.
Es genügt, den Operator &>und das /dev/nullGerät wie unten gezeigt zu verwenden:

sshpass -p $MYPASSWORD ssh [email protected] "sudo -S \
  < /home/myuser/password.txt cp /home/myuser/file1 /etc/sub/folder/" &> /dev/null

NotizIn meinem lokalen System [sudo] password for myuser:funktioniert die Unterdrückung der Ausgabe durch folgende Umleitungen:

  • &>/dev/null
  • >&/dev/null

und das ist normal, weil vorherige Operatoren gleichwertig sind (siehedieser Beitragauf SuperUser).

Die Unterdrückungfunktioniert nichtdurch folgende Weiterleitung:

  • >/dev/null

verwandte Informationen