%20auf%20einem%20Remote-Server%20aus..png)
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 myuser
zur Authentifizierung der SSH-Sitzung erforderlich ist.
Meine Bedürfnisse
Ich muss auch einen cp
Befehl wie den vorherigen ausführen, aber das Ziel für die Datei ist ein Unterordner von /etc
und dafür sind sudo
Berechtigungen 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 sudo
Passwort.
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, file1
ohne /etc/sub/folder/
nach dem sudo
Passwort 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 sudo
die 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
echo
Befehl; die Datei heißtpassword.txt
und enthält nur das Passwort ("mypassword"
) für den Benutzermyuser
. - die Datei
password.txt
dient dem Operator direkt als Eingabe für densudo
Befehl<
. - Ausführung des Befehls
sudo -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/null
Gerä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