Richten Sie die SSH ControlMaster-Sitzung in einem Shell-Skript ein und verwenden Sie sie

Ich schreibe ein Skript, das mehrere Befehlssätze enthält, die auf einem Remote-Server ausgeführt werden müssen, wobei die Ergebnisse dazwischen verarbeitet werden. Derzeit wird dies durch Laufen erreichtssh Für jeden Befehlssatz muss jedoch jedes Mal eine neue Verbindung hergestellt und authentifiziert werden, was langsam ist.

Ich habe vor kurzem über die gelesenControlMaster Option in SSH, die genau das ist, was ich brauche, nämlich die Möglichkeit, separate SSH-Sitzungen über eine einzige SSH-Verbindung auszuführen.

Was ich jedoch äußerst unklar bin, ist, wie genau ich dies in meinem Shell-Skript erreichen würde. Ich habe zum Beispiel darüber nachgedacht, es so zu konstruieren:

#!/bin/sh
HOST="$1"

# Make sure we clean up after ourselves
on_complete() {
    kill $ssh_control_master_id
    rm -r "$tmp_dir"
}
trap 'on_complete 2> /dev/null' SIGINT SIGHUP SIGTERM EXIT

tmp_dir=$(mktemp -d "/tmp/$(basename "$0").XXXXXX")
ssh_control_socket="$tmp_dir/ssh_control_socket"

# Setup control master
ssh -o 'ControlMaster=yes' -S "$ssh_control_socket" "$HOST" &
ssh_control_master_id=$!

# Run initial commands
data=$(ssh -S "$ssh_control_socket" "$HOST" 'echo "Foo"')

# Process the data
echo "$data"

# Run some more commands
data=$(ssh -S "$ssh_control_socket" "$HOST" 'echo "Bar"')

# Process the second batch of data
echo "$data"

Nur ein einfaches Beispiel, um Ihnen eine Idee zu geben, aber dies scheint nicht der richtige Weg zu sein, da es entweder das zweite verursachtssh Befehl zum Aufhängen, oder jeder Befehl wird normal ausgeführt (eigene Verbindung erstellen). Ich bin mir auch nicht sicher, wie ich darauf warten soll, dass die Master-Verbindung hergestellt wird, d. H. Ich führe wahrscheinlich meine tatsächlichen Befehle aus, während die Remote-Verbindung noch hergestellt wird.

Wie kann der Control Master, sobald er ausgeführt wird, ordnungsgemäß geschlossen, beendet und / oder der Socket gelöscht werden?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage