SSH Verbindung offen lassen und nach Bedarf Befehle/Daten austauschen

13/04/2012 - 17:44 von Peter Mairhofer | Report spam
Hallo,

Ich möchte automatisiert über SSH eine Datenabfrage an einen Server
stellen um diese in einem komplexen Script-Ablauf eingliedern zu können:

ssh -i rsa_key -l autouser server '~/bin/getdata.sh param1 param2 ...' |
further_processing

Die Daten werden über STDOUT zurückgeschickt, Fehler per STDERR.
Ggf. werden innerhalb kurzer Zeit viele solche Aufrufe benötigt.

Nun làuft das ganze über VPN WAN und der SSH Verbindungsaufbau dauert
etwa 40s. Ist die Verbindung einmal aufgebaut, geht alles schnell.

Meine Idee war nun: getdata.sh wird ein Server-Script das die
Daten/Befehle per STDIN annimmt und per STDOUT/STDERR ausgibt. Nun rufe
ich einmalig SSH auf und lasse die Verbindung offen:

netcat -l -p 6666 -s 127.0.0.1 -e "ssh -i rsa_key -l autouser server
'~/bin/getdata.sh param1 param2 ...'"

Mein Script verbindet dann nur mehr auf 127.0.0.1:6666 und holt sich die
Daten:

echo GET DATA Y | netcat 127.0.0.1 6666 | further_processing

Doch leider wird SSH erst ausgeführt wenn eine Verbindung ankommt.

Zweiter Versuch:

mkfifo /tmp/fifo
netcat -l -p 6666 -s 127.0.0.1 < /tmp/fifo | ssh -i rsa_key -l autouser
server '~/bin/getdata.sh param1 param2 ...' >/tmp/fifo

So ganz haut das allerdings nicht hin. Der Befehl hàngt sich auf und ein
netcat 127.0.0.1 6666 liefert nichts zurück.

Dritter Versuch:

Die SSH Verbindung offen lassen und mittels Port-Forwarding
kommunizieren: getdata.sh lauscht am *Server* mittels netcat auf 6666.
Am Client rufe ich auf:

ssh -L 127.0.0.1:6666:127.0.0.1:6666 -i rsa_key -l autouser server
'~/bin/getdata.sh'

Die lokalen Scripts holen sich die Daten ebenfalls per netcat 127.0.0.1
6666. Obwohl ich es noch nicht ausprobiert hab ergibt das folgendes
Problem: Das System wird gleichzeitig von beliebig vielen Usern
verwendet, d.h. die LISTEN Ports am Server müssten irgendwie aufwendig
gemanaged werden und irgendwie an den Client übermittelt werden.


Gibts irgendwelche kreativen Ideen?

LG
Peter

PS: Das ganze soll möglichst mit Bordmitteln/Scripts laufen
PPS: Am Server steht lediglich eine minimale cygwin Umgebung (CopSSH)
unter Windows zu Verfügung; dezidierte Dienste/Server können nicht
verwendet werden
 

Lesen sie die antworten

#1 Stefan Enzinger
13/04/2012 - 19:09 | Warnen spam
Hallo, ich hab deinen Text nur kurz überflogen. Hoffe das wird keine
Themenverfehlung :)

On 04/13/2012 05:44 PM, Peter Mairhofer wrote:

Meine Idee war nun: getdata.sh wird ein Server-Script das die
Daten/Befehle per STDIN annimmt und per STDOUT/STDERR ausgibt. Nun rufe
ich einmalig SSH auf und lasse die Verbindung offen:



$ mkfifo ssh_sink
$ tail -f ssh_sink | ssh $SERVER_IP
$ echo 'uptime' > ssh_sink
$ sleep 4
$ echo 'uptime' > ssh_sink

das tut bei mir zumindest etwas :)

lg

Ähnliche fragen