Hallo zusammen, 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. Kann mir einer auf die Sprünge helfen.
Am Montag, 24. Januar 2005 20:32 schrieb christian zimmermann:
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.
RSYS=`ssh root@db1.domain.com if [ -d /ha/db2/db2inst1/ ] then RSYS=$DB1 else RSYS=$DB2 fi`
das kann doch so gar nicht gehen. man kann ssh nur ein Programmnamen angeben, welches dann ausgeführt werden soll: If command is specified, command is executed on the remote host instead of a login shell. if [...] ist aber kein Programm, sondern wird von der shell interpretiert. Also die ganze if-Anweisung in ein kleines Script packen und das dann aufrufen. Dessen Ausgabe steht dann wieder in der Shell-variablen. BTW:
if [ -d /ha/db2/db2inst1/ ] then RSYS=$DB1 else RSYS=$DB2 fi
vor dem "then", "else" und "fi" fehlt ein ; (Semikolon) Das muß da stehen, wenn alles auf einer Zeile steht. Bye Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 9204871 Fax: +49(721) 24874 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer
On Friday 28 January 2005 09:36, Dr. Jürgen Vollmer wrote:
Am Montag, 24. Januar 2005 20:32 schrieb christian zimmermann:
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.
RSYS=`ssh root@db1.domain.com if [ -d /ha/db2/db2inst1/ ] then RSYS=$DB1 else RSYS=$DB2 fi`
das kann doch so gar nicht gehen. man kann ssh nur ein Programmnamen angeben, welches dann ausgeführt werden soll: If command is specified, command is executed on the remote host instead of a login shell.
if [...] ist aber kein Programm, sondern wird von der shell interpretiert. Also die ganze if-Anweisung in ein kleines Script packen und das dann aufrufen. Dessen Ausgabe steht dann wieder in der Shell-variablen.
BTW:
if [ -d /ha/db2/db2inst1/ ] then RSYS=$DB1 else RSYS=$DB2 fi
vor dem "then", "else" und "fi" fehlt ein ; (Semikolon) Das muß da stehen, wenn alles auf einer Zeile steht.
1. Es gehen auch Shell Befehle. Man muss sie halt richtig quoten:
ssh localhost 'if [ -d / ]; then echo "/ is dir"; fi' / is dir
2. Lösung:
RSYS=$(ssh localhost 'if [ -d /etc ]; then echo "localhost"; fi') r2@opi:~> echo $RSYS localhost
Du kannst auch ausnutzen, dass ssh den Return-Code des Kommandos zurückgibt: if ssh localhost '[ -d /etc ]'; then echo localhost; fi Torsten
Torsten Foertsch wrote:
2. Lösung:
RSYS=$(ssh localhost 'if [ -d /etc ]; then echo "localhost"; fi')
r2@opi:~> echo $RSYS localhost
Hallo, also dies habe ich nun mal getestet. aber irgend etwas läuft noch nicht so recht RSYS=$(ssh root@db1.virtuelle-apotheke.de 'if [ -d /ha/db2/db2inst1/ ]; then echo "\$DB1" ;else echo "\$DB2"; fi') echo $RSYS $DB1 mhh wieso dird denn jetzt nicht die Variable in db1.domain.com aufgelöst? Diese ist im script ja als DB1=db1.domain.com definiert? Wäre nett wenn mir hier jemand helfen könnte.
Am Montag, 24. Januar 2005 22:27 schrieb christian zimmermann:
Torsten Foertsch wrote:
2. Lösung:
RSYS=$(ssh localhost 'if [ -d /etc ]; then echo "localhost"; fi')
r2@opi:~> echo $RSYS localhost
Hallo,
also dies habe ich nun mal getestet. aber irgend etwas läuft noch nicht so recht
RSYS=$(ssh root@db1.virtuelle-apotheke.de 'if [ -d /ha/db2/db2inst1/ ]; then echo "\$DB1" ;else echo "\$DB2"; fi')
echo $RSYS $DB1
mhh wieso dird denn jetzt nicht die Variable in db1.domain.com aufgelöst? Diese ist im script ja als DB1=db1.domain.com definiert?
' .. ' verhindert die Expansion jeglicher Variablen. Folgendes geht dann: ssh .... "if ... then echo $DB1 ..." Hier wird $DB1 expandiert bevor das ssh-Kommando ausgeführt wird. Das kann man sehr schön nachvollziehen, wenn man set -x vorher setzt. Bsp: $ set -x $ a=abc; ssh localhost "if [ $a = abx ]; then echo 1; else echo 2; fi" + a=abc + ssh localhost 'if [ abc = abx ]; then echo 1; else echo 2; fi' 2 Bye Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 9204871 Fax: +49(721) 24874 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer
Dr. Jürgen Vollmer wrote:
' .. ' verhindert die Expansion jeglicher Variablen. Folgendes geht dann: ssh .... "if ... then echo $DB1 ..." Hier wird $DB1 expandiert bevor das ssh-Kommando ausgeführt wird. Das kann man sehr schön nachvollziehen, wenn man set -x vorher setzt. Bsp: $ set -x $ a=abc; ssh localhost "if [ $a = abx ]; then echo 1; else echo 2; fi" + a=abc + ssh localhost 'if [ abc = abx ]; then echo 1; else echo 2; fi' 2
Bye Jürgen
Hallo Jürgen, hervorragend nun geht es ohne :) vielen dank für das mittdenken. wo finde ich den infos was "" '' und `` genau machen in der shell -- Mit freundlichen Gruessen Christian Zimmermann _\|/_ (@ @) -----oOOo-(_)-oOOo----- VitaNet GmbH Industriestr. 50b 69190 Walldorf Tel: 06227-35676961 Fax:06227-3567989 www.vitanet.de c.zimmermann@vitanet.de
Am Montag, 24. Januar 2005 22:53 schrieb christian zimmermann:
wo finde ich den infos was "" '' und `` genau machen in der shell
man bash am besten aber in einem Buch zum Thema Shell-Scripte. z.B. dem Original: @TECHREPORT{bourne.1978a, AUTHOR = "Bourne, Steve R.", TITLE = "An Introduction to the UNIX Shell", YEAR = 1978, INSTITUTION = "Bell Labs Research", NOTE = "Seventh Edition of Unix http://cm.bell-labs.com/7thEdMan/vol2/shell.bun und http://www.ling.helsinki.fi/users/reriksso/Unix/shell.html", KEYWORD = "Programmiersprachen, Unix Tools, Shell", LOCATION = "jv", URL = "http://cm.bell-labs.com/7thEdMan/vol2/shell.bun und http://www.ling.helsinki.fi/users/reriksso/Unix/shell.html", } oder auf deutsch und nicht nur bash, sonder auch noch ksh, csh etc.: @BOOK{herold.1996a, AUTHOR = "Herold, Helmut", SERIES = "UNIX und seine Werkzeuge", TITLE = "Unix-Shells", PUBLISHER = addison, YEAR = 1996, EDITION = 2, KEYWORD = "Programmiersprachen, Bourne Shell, Korn-Shell, C-Shell, bash, tcsh", LOCATION = "jv", } gibt's auch in einer Neuauflage mit "Linux" im Titel Bye Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 9204871 Fax: +49(721) 24874 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer
Am Montag, 24. Januar 2005 20:32 schrieb christian zimmermann:
RSYS=`ssh root@db1.domain.com if [ -d /ha/db2/db2inst1/ ] then RSYS=$DB1 else RSYS=$DB2 fi`
On Friday 28 January 2005 09:36, Dr. Jürgen Vollmer wrote:
das kann doch so gar nicht gehen. man kann ssh nur ein Programmnamen angeben, welches dann ausgeführt werden soll:
Am Freitag, 28. Januar 2005 10:00 schrieb Torsten Foertsch:
1. Es gehen auch Shell Befehle. Man muss sie halt richtig quoten: ssh localhost 'if [ -d / ]; then echo "/ is dir"; fi'
man lernt nie aus .... Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 9204871 Fax: +49(721) 24874 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer
christian zimmermann wrote:
RSYS=`ssh root@db1.domain.com if [ -d /ha/db2/db2inst1/ ] then RSYS=$DB1 else RSYS=$DB2 fi`
Deine IF-Syntax ist ein bisschen ruppig ;-) Versuch's mal mit so Etwas RSYS=`ssh root@db1.domain.com "DB1=root@db1.domain.com; DB2=root@db2.domain.com; if [ -d /etc ]; then echo $DB1; else echo $DB2; fi"` NTB: Die Variablen DB1 und DB2 müssen remote bekannt sein, es nützt nichts wenn du sie lokal setzt. Aber im Quoten bin ich nicht Experte, da kann sicher unser Freund David weiter helfen. HTH Claus
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"
participants (5)
-
christian zimmermann
-
claus
-
David Haller
-
Dr. Jürgen Vollmer
-
Torsten Foertsch