Ist es möglich, ein Bash-Skript zu schreiben, bei dem
- von Computer A aus gestartet wird und sich auf einem anderen Computer anmeldet Maschine B von ssh (beide Maschinen A und B wären Linux-Maschinen),
- kopiert einige Dateien auf Maschine B
- führt ein Python-Skript und ein bestimmtes Python-Skript auf diesen Maschinen aus.
- überträgt die Ergebnisse zurück an Maschine A
- meldet sich von Maschine B ab.
Ist dies technisch machbar?
Antwort
Natürlich ist es machbar:
scp file user@host: ssh user@host path_to_script scp user@host:file_to_copy ./
und das wars …
Es gibt jedoch ein Problem: Sie werden dreimal nach dem Kennwort gefragt. Um zu vermeiden, dass Sie SSH-Schlüssel generieren und Benutzer mit diesen Schlüsseln autorisieren können.
So generieren Sie SSH Schlüssel führen ssh-keygen -t rsa aus, beantworten Fragen und kopieren den öffentlichen Schlüssel auf den Remote-Host (Computer B) in die Datei ~/.ssh/authorized_keys. Der private Schlüssel sollte in ~/.ssh/id_rsa auf dem lokalen Computer (A).
Kommentare
- Wenn öffentliche Schlüssel keine Option sind, können Sie etwas Grobes tun, um Kennwortabfragen wie
cat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results - zu minimieren Wenn Sie das Kennwort verwenden möchten, können Sie jederzeit das Verbindungspooling von OpenSSH ' verwenden, indem Sie
ControlMaster=yesundControlPath=/path/to/socketfileund starten Sie dann eine SSH-Verbindung mit-f, um ein Hintergrund-SSH auszuführen. Weisen Sie alle nachfolgenden SSH-Verbindungen an, dieselbe Socket-Datei zu verwenden.
Antwort
Ich kann alles in tun eine einzelne ssh Verbindung / Sitzung:
ssh user@host "cat > remote_dst; command; cat remote_src" < local_src > local_dst
Dies:
- Kopien
local_srcbisremote_dst, - Führt
command, - Kopiert
remote_srcnachlocal_dst.
Aber wenn command schreibt auf stdout, das Ergebnis ist auch in local_dst. Wenn command Eingaben von stdin liest, erhält es EOF.
Antwort
Während Sie dies in einer einzelnen SSH-Sitzung tun können, ist es „etwas schwierig, das Kopieren von Dateien mit laufenden Befehlen zu kombinieren.
Die einfachste Möglichkeit, diese Aufgabe zu lösen, besteht darin, separate SSH-Sitzungen für die drei Vorgänge auszuführen:
rsync -a inputs/ machineB:inputs/ ssh machineB "some command -i inputs -o outputs" rsync -a machineB:outputs/ outputs/
Dies erfordert eine dreimalige Authentifizierung bei machineB Die empfohlene Methode zur Vermeidung einer mehrfachen Authentifizierung ist die Verwendung der Verbindungsfreigabefunktion in modernen OpenSSH-Versionen: Starten Sie ein für alle Mal eine Master-Verbindung zu B und lassen Sie SSH automatisch auf diese Master-Verbindung huckepack nehmen. Fügen Sie ControlMaster auto und eine ControlPath Zeile zu Ihrer ~/.ssh/config hinzu. Starten Sie dann im Hintergrund eine Master-Verbindung und führen Sie dann Ihre Aufgaben aus.
ssh -fN machineB # start a master connection in the background # Subsequent connections will be slaves to the existing master connection rsync -a inputs/ machineB:inputs/ ssh machineB "some command -i inputs -o outputs" rsync -a machineB:outputs/ outputs/
Verwenden Sie nicht scp o r rsync zum Kopieren von Dateien ist es möglicherweise einfacher, das Remote-Dateisystem unter SSHFS bereitzustellen. Dies kümmert sich übrigens um das Einrichten einer Master-Verbindung (vorausgesetzt, Sie haben Ihre ~/.ssh/config wie oben angegeben eingerichtet).
mkdir /net/machineB sshfs machineB: /net/machineB cp -Rp inputs /net/machineB/ ssh machibeB "some command -i inputs -o outputs" cp -Rp /net/machineB/outputs .