Ich habe ein Skript, das wie folgt aussieht:
ssh host command1
scp file1 host:/tmp
ssh host command2
Gibt es eine Möglichkeit, sie alle in einem ssh/scp
Aufruf zu kombinieren? Mein Problem ist, dass ich das Kopieren von Dateien mit der Ausführung von Befehlen kombiniere, was verschachtelt erfolgen muss. Ich hatte auf so etwas gehofft:
ssh_sometool host -c command1 -cp file1 /tmp -c command2
Es geht nicht um die Syntax (ich könnte eine solche Funktion schreiben), sondern um alles, was innerhalb derselben ssh
Sitzung geschieht
Antwort1
Zunächst einmal gibt es keine einfache oder standardmäßige Möglichkeit, das zu tun, was Sie möchten. Lassen Sie mich außerdem Folgendes klarstellen:es gibt keine Möglichkeit, mit einem Standard-SSH-Client das zu tun, was Sie wollen.
Es gibt eine extrem alte Gabelssh-xfer. Beachten Sie, dass selbst die Entwickler dieses Tools betonen, dass ihre Lösung „hackish“ und wirklich alt ist, sodass Sie sie nicht verwenden sollten. Die letzte SSH-Version, die für die Verwendung mit diesem Tool gepatcht wurde, ist OpenSSH-3.8.1p1
(unter Arch Linux ist die aktuelle Version OpenSSH_7.6p1
).
Wenn es für Sie wichtig ist, die Dinge schnell zu erledigen und die Anzahl der Verbindungen/Handshakes zwischen Hosts zu minimieren, sollten Sie sich nach Bereitstellungs-/Orchestrierungstools umsehen.Ansiblescheint der einfachste Weg zu sein, die Aufgabe ohne viel zusätzliche Konfiguration zu erledigen, währendSalzkönnte am schnellsten sein.
Wie dem auch sei, sowohl Ansible als auch Salt nutzen zusätzliche Verbindungen, damit alles funktioniert, und ich bin nicht sicher, ob Sie leistungsmäßig einen Vorteil erzielen würden, wenn Sie diese anstelle einer SSH/SCP-Kombination verwenden würden.
UPDATE: Wenn Sie viele Dateien pushen und pullen müssen und zwischen diesen Übertragungen einige zusätzliche Skripte laufen, erledigt fast jedes Bereitstellungstool (Chef, Puppet, Salt, Ansible) dies schneller als einfaches ssh/scp.
Antwort2
SSH ermöglicht es, eine Sitzung noch eine Weile aufrecht zu erhalten, nachdem Sie die Verbindung getrennt haben, sodass Sie die Verbindung beim nächsten Mal nicht erneut herstellen müssen. Hier sind die Optionen für die SSH-Konfiguration, um dies zu aktivieren:
Host *
ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h-%p
ControlPersist 30
ControlMaster
ermöglicht die gemeinsame Nutzung mehrerer Sitzungen über eine einzige Netzwerkverbindung. Wenn auf gesetzt auto
, wird bei jedem neuen Versuch geprüft, ob die entsprechende Verbindung besteht und entweder wird sie verwendet oder eine neue Verbindung erstellt.
ControlPath
Gibt den Pfad an, in dem die Verbindungen gespeichert sind.Stellen Sie sicher, dass dieser Pfad existiert!Erstellen Sie dazu das Verzeichnis (Steckdosenhier, aber benennen Sie es, wie Sie möchten) manuell.
ControlPersist
Gibt an, wie lange die Verbindung bestehen bleibt, nachdem Sie sie getrennt haben. Die Zeitangabe erfolgt in Sekunden.
Zur weiteren Erläuterung der Optionen verwenden Sie man ssh_config
.
Nachdem Sie diese zu Ihrem hinzugefügt haben ~/.ssh/config
, wird nur eine Sitzung für diese drei Befehle geöffnet.
Auf meinem Computer ergibt sich eine fünffache Beschleunigung: 100 Verbindungen hintereinander zu einem (nahegelegenen) Host funktionieren in 30 Sekunden ohne dauerhafte Sitzungen und in nur 5-6 Sekunden mit ihnen.
PS Manchmal (zum Beispiel wenn Sie das Netzwerk geändert haben) brechen Ihre bestehenden SSH-Verbindungen ab und neue lassen sich nicht herstellen, weil die Datei mit der Verbindung nicht existiert. Gehen Sie in diesem Fall einfach zu ~/.ssh/sockets
und löschen Sie die erforderliche Datei manuell.
Antwort3
Sie können beitreten und alle Ihre Dateien über die SSH-Standardeingabe übergeben und sie in Ihrer Remotesitzung empfangen. Ich meine etwa so:
tar -cf - file1 file2 | ssh host 'TDIR=`mktemp -d`; tar -xf - -C "$TDIR"; cat "$TDIR/file1"; command1; command2 ...'
- Der
cat "$TDIR/file1"
Befehl ist nur ein Beispiel für den Zugriff auf Ihre empfangenen Dateien. - Verwenden Sie Tar mit dem Schalter -j oder -J sowohl auf der lokalen als auch auf der Remote-Seite, um Ihre Dateien komprimiert zu übergeben.
- Sie können alle Ihre Befehle in ein Bash-Skript einfügen, es in Ihr Archiv aufnehmen und auf der Remote-Seite ausführen wie
...tar -xf - -C "$TDIR"; bash "$TDIR/script.sh"'
Antwort4
Sobald in Ihrem Skript die erste Zeile ausgeführt wird ...
ssh host command1
Die Ausführung wird an ssh übergeben + Ihr zweiter Befehl (scp) wird erst ausgeführt, wenn command1 abgeschlossen ist. Eine Möglichkeit, diese parallel auszuführen, besteht darin, jede Aufgabe im Hintergrund auszuführen, wie folgt ...
ssh host command1 &
scp file1 host:/tmp &
ssh host command2 &
Daher werden jetzt alle drei Aufgaben gleichzeitig im Hintergrund ausgeführt.