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=yes
undControlPath=/path/to/socketfile
und 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_src
bisremote_dst
, - Führt
command
, - Kopiert
remote_src
nachlocal_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 .