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

11

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

  1. würde von Maschine A gestartet werden, sich von ssh auf einer anderen Maschine B anmelden (beide Maschinen A und B wären Linux-Maschinen),
  2. kopiert einige Dateien auf Computer B.
  3. Führt auf diesen Computern ein Python-Skript und ein bestimmtes Python-Skript aus.
  4. überträgt die Ergebnisse zurück an Maschine A.
  5. meldet sich von Maschine B ab.

Ist das technisch machbar?

Aufwind
quelle

Antworten:

15

Natürlich ist es machbar:

scp file user@host:
ssh user@host path_to_script
scp user@host:file_to_copy ./

und das ist es...

Es gibt jedoch ein Problem: Sie werden dreimal nach dem Passwort gefragt. Um dies zu vermeiden, können Sie SSH-Schlüssel generieren und Benutzer mit diesen Schlüsseln autorisieren.

Um die Ausführung von SSH-Schlüsseln zu generieren ssh-keygen -t rsa, beantworten Sie Fragen und kopieren Sie den öffentlichen Schlüssel auf den Remote-Host (Computer B) in die ~/.ssh/authorized_keysDatei. Der private Schlüssel sollte ~/.ssh/id_rsaauf dem lokalen Computer (A) gespeichert werden .

pbm
quelle
Wenn öffentliche Schlüssel keine Option sind, können Sie etwas Grobes tun, um Passwortabfragen wiecat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
Patrick
Wenn Sie das Kennwort verwenden möchten, können Sie jederzeit das Verbindungspooling von OpenSSH verwenden, indem Sie ControlMaster=yesund definieren ControlPath=/path/to/socketfile, und dann eine SSH-Verbindung mit starten -f, um ein Hintergrund-SSH auszuführen. Weisen Sie alle nachfolgenden SSH-Verbindungen an, dieselbe Socket-Datei zu verwenden.
jsbillings
4

Ich kann alles in einer einzigen sshVerbindung / Sitzung erledigen :

ssh user@host "cat > remote_dst; command; cat remote_src" < local_src > local_dst

Dies:

  1. Kopien local_srcan remote_dst,
  2. Führt aus command,
  3. Kopien remote_srcnach local_dst.

Aber wenn commandweiter geschrieben wird stdout, ist das Ergebnis auch in local_dst. Wenn commandEingaben von gelesen werden stdin, werden und empfangen EOF.

jfg956
quelle
3

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.

Der einfachste Weg, um 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 Maschine B. Die empfohlene Methode, um eine mehrfache Authentifizierung zu vermeiden, besteht darin, die Verbindungsfreigabefunktion in modernen Versionen von OpenSSH zu verwenden: 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 autound eine ControlPathZeile zu Ihrer hinzu~/.ssh/config , starten Sie dann eine Master-Verbindung im Hintergrund 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/

Anstatt scp oder rsync zum Kopieren von Dateien zu verwenden, 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/configwie 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 .
Gilles 'SO - hör auf böse zu sein'
quelle