Hallo, Am Mon, 24 Jan 2005, christian zimmermann schrieb:
ich habe da ein Problem mit einem Shell Script, und zwar folgendes. Ich möchte via ssh checken ob ein bestimmter rechner ein bestimmtes verzeichniss hält, hält er diese soll der hostname als variable gespeichert werden.
Die wichtigsten teile:
DB1=root@db1.domain.com DB2=root@db2.domain.com
RSYS=`ssh root@db1.domain.com if [ -d /ha/db2/db2inst1/ ] then RSYS=$DB1 else RSYS=$DB2 fi`
die Variable RSYS wird aber leider nicht gesetzt. sondern bleibt immer leer.
Klar. Das Kommando (if .. fi) ist nicht nur flasch geschrieben, sondern hat auch keine Ausgabe. Du musst dir v.a. auch klarmachen, welcher Teil lokal und welcher Teil remote ausgefuehrt wird. Und wann Variablen aufgeloest werden (remote oder lokal). Dass ssh den Exitcode des Kommandos zurueckgibt kann man sich naemlich direkt zu Nutze machen: if ssh root@db1.domain.com test -d /ha/db2/db2inst1/; then RSYS="$DB1" else RSYS="$DB2" fi Remote wird dann nur "test -d /ha/db2/db2inst1" ausgefuehrt. Man koennte auch mehr remote ausfuehren: ( set -x; DB1="db1"; DB2="db2"; RSYS=`ssh dh@localhost sh -x -c '"if test -d / ; then echo \"'$DB1'\"; else echo \"'$DB2'\"; fi"'`; echo "$RSYS"; ) + DB1=db1 + DB2=db2 ++ ssh dh@localhost sh -x -c '"if test -d / ; then echo \"db1\"; else echo \"db2\"; fi"' dh@localhost's password: + test -d / + echo db1 + RSYS=db1 + echo db1 db1 Man beachte, dass ssh schon mit den aufgeloesten Variablen DB1/DB2 aufgerufen wird (Zeile "++ ssh ...". Es geht aber auch ohne das 'sh -c', was das quoting vereinfacht: ( set -x; DB1="db1"; DB2="db2"; RSYS=`ssh dh@localhost "set -x; if test -d / ; then echo '$DB1'; else echo '$DB2'; fi;"` ; echo "$RSYS";) + DB1=db1 + DB2=db2 ++ ssh dh@localhost 'set -x; if test -d / ; then echo '\''db1'\''; else echo '\''db2'\''; fi;' dh@localhost's password: + test -d / + echo db1 + RSYS=db1 + echo db1 db1 Wieder wird die remote-shell mit dem Inhalt der Variablen aufgerufen. Andernfalls muss man die $ escapen (bzw. das ganze remote auszufuehrende script in '' an ssh uebergeben) und die Variablen auch remote definieren: ( set -x; RSYS=`ssh dh@localhost 'set -x; DB1="db1"; DB2="db2"; if test -d / ; then echo "$DB1"; else echo "$DB2"; fi;'`; echo "$RSYS"; ) ++ ssh dh@localhost 'set -x; DB1="db1"; DB2="db2"; if test -d / ; then echo "$DB1"; else echo "$DB2"; fi;' dh@localhost's password: + DB1=db1 + DB2=db2 + test -d / + echo db1 + RSYS=db1 + echo db1 db1 HTH, -dnh -- "C++ also supports the notion of *friends*: cooperative classes that are permitted to see each other's private parts." -- Grady Booch, "Object Oriented Design with Applications"