peshay
12-01-2009, 09:39
Hallo, ich habe bei einem Skript ein Problem mit einer If-Schleife in einer While-Schleife, das Skript soll auf mehreren Servern SQL-Befehle ablassen.
Hier der Part, der mir Schwierigkeiten bereitet.
while read liste; do
# set variables from server database
HOST=$(echo $liste | awk '{ print $1 }')
PORT=$(echo $liste | awk '{ print $2 }')
OUSER=$(echo $liste | awk '{ print $3 }')
DBUSER=$(echo $liste | awk '{ print $5 }')
DBPASS=$(echo $liste | awk '{ print $6 }')
if CheckHost $HOST $PORT $OUSER; then
# write log info
echo --------- Executing command at $HOST --------- | tee -a logfile
# create command
echo -e "connect $DBUSER/$DBPASS;\n$(cat $commandfile)\nexit;" >$tmpfile
$ssh -p $PORT $OUSER@$HOST <$tmpfile "cat >command
source .profile 2>/dev/null
cat command | sqlplus -S /nolog
rm command
" 2>&1 | tee -a logfile
else
Hint connection to $HOST could not be established. >>logfile
fi
done < ~/remote-cmd-script/dbliste
Die Funktion CheckHost(), prüft nur ob der hostname richtig ist, ein ping geht und ein kurzer ssh funktionert. Sie gibt mir auch den return code 0 zurück was ich zum Beispiel mit einem "&& echo $?" dahinter geprüft habe.
Die If-Schleife läuft dann einmal durch, anschließend wird die While-Schleife beendet, obwohl noch viele weitere Einträge in der dbliste sind.
Wenn ich die If-Schleife raus nehme, läuft das Skript komplett über alle Einträge in der dbliste.
Mir ist irgendwie nicht klar, was mit dieser If-Schleife nicht stimmt.
Ich habe auch schon ein set -x reingesetzt, das Skript beendet sich mit If-Schleife dann so:
+ echo -e 'connect corpus/corpus;\nselect login from party where login like '\''sumuser'\'';\nexit;'
+ ssh -o BatchMode=yes -p 22 user@somehost 'cat >command
+ tee -a logfile
source .profile 2>/dev/null
cat command | sqlplus -S /nolog
rm command
'
LOGIN
----------------------------------------------------------------
sumuser
logout
+ read liste
+ OnExit
+ set +x
Als würde die liste auf einmal nichts mehr liefern...
Achja, ein Tipp wie ich die Variablen einfacher befüllen kann als so, wäre auch echt nett:
HOST=$(echo $liste | awk '{ print $1 }')
Hier der Part, der mir Schwierigkeiten bereitet.
while read liste; do
# set variables from server database
HOST=$(echo $liste | awk '{ print $1 }')
PORT=$(echo $liste | awk '{ print $2 }')
OUSER=$(echo $liste | awk '{ print $3 }')
DBUSER=$(echo $liste | awk '{ print $5 }')
DBPASS=$(echo $liste | awk '{ print $6 }')
if CheckHost $HOST $PORT $OUSER; then
# write log info
echo --------- Executing command at $HOST --------- | tee -a logfile
# create command
echo -e "connect $DBUSER/$DBPASS;\n$(cat $commandfile)\nexit;" >$tmpfile
$ssh -p $PORT $OUSER@$HOST <$tmpfile "cat >command
source .profile 2>/dev/null
cat command | sqlplus -S /nolog
rm command
" 2>&1 | tee -a logfile
else
Hint connection to $HOST could not be established. >>logfile
fi
done < ~/remote-cmd-script/dbliste
Die Funktion CheckHost(), prüft nur ob der hostname richtig ist, ein ping geht und ein kurzer ssh funktionert. Sie gibt mir auch den return code 0 zurück was ich zum Beispiel mit einem "&& echo $?" dahinter geprüft habe.
Die If-Schleife läuft dann einmal durch, anschließend wird die While-Schleife beendet, obwohl noch viele weitere Einträge in der dbliste sind.
Wenn ich die If-Schleife raus nehme, läuft das Skript komplett über alle Einträge in der dbliste.
Mir ist irgendwie nicht klar, was mit dieser If-Schleife nicht stimmt.
Ich habe auch schon ein set -x reingesetzt, das Skript beendet sich mit If-Schleife dann so:
+ echo -e 'connect corpus/corpus;\nselect login from party where login like '\''sumuser'\'';\nexit;'
+ ssh -o BatchMode=yes -p 22 user@somehost 'cat >command
+ tee -a logfile
source .profile 2>/dev/null
cat command | sqlplus -S /nolog
rm command
'
LOGIN
----------------------------------------------------------------
sumuser
logout
+ read liste
+ OnExit
+ set +x
Als würde die liste auf einmal nichts mehr liefern...
Achja, ein Tipp wie ich die Variablen einfacher befüllen kann als so, wäre auch echt nett:
HOST=$(echo $liste | awk '{ print $1 }')