Hallo,
leider habe ich eine etwas allgemeinere Ueberschrift gewaehlt, weil ich nicht weiss, wie ich mein Programmierproblem genauer beschreiben soll.
Folgendes Szenario: es sind 3 Rechner via ssh erreichbar, wobei man Rechner C nur von Rechner B und Rechner B nur von Rechner A aus erreichen kann. Rechner A ist der Gateway.
Bisher musste man sich erst auf Rechner A einloggen, dann auf Maschine B usw.
Um das alles zu vereinfachen, kann man eine ssh-Kette bilden nach dem Muster:
Code:
ssh -t user@gateway.example.com ssh -t user@server.example.com ssh -t user@server2.example.com
Dabei gibt man nur noch die Passwoerter ein.
Nun kann man dies mittels eines Shellskriptes so vereinfachen, dass man das Skript mit dem Rechnernamen als ersten Parameter aufruft und dann nur noch die Passwoerter eingeben muss und dann auf der entsprechenden Maschine eingeloggt ist. Also z.B.: "connect.sh server2".
Das habe ich auch ganz nett mit 'case' geloest, wobei ich die Rechner zuvor in entsprechenden Variablen deklariert habe.
Das sieht dann etwa so aus:
Code:
#!/bin/bash
# connect.sh
SSH_EX="ssh -t"
GW="gateway.example com"
SER="server.example.com"
SER2="server2.example.com"
case $i in
gateway)
$SSH_EX $GW
;;
server)
$SSH_EX $GW $SSH_EX $SER
;;
server2)
$SSH_EX $GW $SSH_EX $SER $SSH_EX $SER2
;;
esac
Natuerlich sind im konkreten Fall mehr Maschinen vorhanden.
Und wie man sieht, ist das Skript nicht sonderlich effizient, weil man bei Aenderungen in der Infrastruktur alles 2x aendern muss. Das ist nicht akzeptabel.
Was ich mir vorstelle, ist so etwas:
Code:
#!/bin/bash
# connect.sh
SSH_EX="ssh -t"
GATE="$SSH_EX gateway.example com"
SERV="$GATE $SSH_EX server.example.com"
SERV2="$SERV $SS_EX server2.example.com"
# das funktioniert so nicht:
$($1)
Dabei wuerde ich das Skript dann gerne so aufrufen: "connect.sh SERV2".
Aber wie mache ich der bash klar, dass sie das, was sie als Paramter bekommen hat, zu dem expandieren (und dann ausfuehren) soll, was in der Variable "SERV2" steht, ohne dass man eine Einzelfallunterscheidung trifft?
Lesezeichen