Wie schreibe ich ein Bash-Skript, das sich auf einem anderen Computer anmeldet, um Dinge zu erledigen?

Ist es möglich, ein Bash-Skript zu schreiben, bei dem

  1. 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),
  2. kopiert einige Dateien auf Maschine B
  3. führt ein Python-Skript und ein bestimmtes Python-Skript auf diesen Maschinen aus.
  4. überträgt die Ergebnisse zurück an Maschine A
  5. 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 und ControlPath=/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:

  1. Kopien local_src bis remote_dst,
  2. Führt command,
  3. Kopiert remote_src nach local_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 . 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.