• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Shell Script->ssh "Befehl" unterbricht

JoKurt

Member
Ich bin es mal wieder und hänge an meinem nächsten Problem....

Das script läuft bis zum Ende durch, allerdings wird die Schleife nur einmal wiederholt, kein zweites oder drittes mal :(

Ich vermute, das es mit der Statusmeldung des ssh Kommandos liegt.
Allerdings muss ich innerhalb der Schleife das rüberkopierte Programm auch via ssh remote starten. Nur wie kann ich das machen, ohne das die Schleife beim ertsen durchlauf gestoppt und der Rest des Programms ausgeführt wird?

Code:
while IFS=: read address type
        do
          echo "Connect to:" $address " copy needed files to: "$type
                ifconfig eth0 | grep "addr:" | cut -d ":" -f2 >./temp1.txt
                target_addr=`cat ./temp1.txt | cut -d " " -f1`
                echo "scp /tmp/*.txt root@"$target_addr":/version" > temp2.txt
                echo "rm /tmp/*.txt" > temp4.txt
                cat $type.template  temp2.txt temp4.txt > ./version_$type.sh
                chmod +x ./version_$type.sh
                rm ./temp*
                scp version_$type.sh root@$address:/tmp
                ssh root@$address "/tmp/version_$type.sh" ## <- lässt die Schleife beenden, lass ich die Zeile weg, funktioniert es
                sleep 10
                rm ./version_$type.sh
done < ./version.cfg

Zur kurzen Erklärung, was das Script machen soll:

1. es liest aus einer Config-Datei IP und Typ aus
2. erstellt dem Typ entsprechend ein Script und kopiert es auf den Rehcner mit der ausgelesenen IP
3. es startet das Script auf den Rechner mit der ausgelesenen IP via ssh.
4. das entfernt gestartete Script liest die Programmversion eines Tools aus und kopiert das Ergebnis per scp auf den Host Server
5. das ganze soll wieder von vorn beginnen, bis das Ende der Config-Datei erreicht ist

Ich hoffe es kann mir wer weiter helfen.

Danke Jo Kurt
 

nbkr

Guru
Was ist denn das Ergeniss wenn Du den SSH Befehl manuell ausführst. Fragt dich SSH evtl. nach dem Passwort oder gibt es sonst eine Fehlermeldung?
 
OP
J

JoKurt

Member
Der ssh-Befehl läuft manuell durch.
Ich vermute eher, dass nach dem erfolgreichen Beenden ein "break" gesenet wird, was die Schleife abbrechen lässt.
 

regexer

Advanced Hacker
JoKurt schrieb:
Der ssh-Befehl läuft manuell durch.
Ich vermute eher, dass nach dem erfolgreichen Beenden ein "break" gesenet wird, was die Schleife abbrechen lässt.
Durchaus möglich. Laut manpage hat ssh sehr viele Optionen ... vielleicht ist da was dabei.

Falls das aber mit dem break stimmen sollte, müsste es doch auch einfach genügen, den ssh in ein extra Shellscript zu packen. Dann kann der in diesem Script breaken wie er will.
 
OP
J

JoKurt

Member
Na das mit dem externen Script hatte ich auch versucht. Brachte das gleiche Ergebnis -> Abbruch der Schleife.

Werde mir noch einmal die Manpages von ssh durchlesen.
Evtl. habe ich etwas übersehen.

Danke
 
OP
J

JoKurt

Member
Mmh, nix dabei.

Ich würde das ganze auch mit for und awk versuchen, wenn ich nur einen Ansatz hätte wie das gehen soll.

Danke
JoKurt
 
OP
J

JoKurt

Member
Hier einmal was passiert:

Code:
+ read address type
+ echo 'Connect to:' 10.10.3.201 ' copy needed files to: loader'
Connect to: 10.10.3.201  copy needed files to: loader
+ ifconfig eth0
+ grep addr:
+ cut -d : -f2
++ cat ./temp1.txt
++ cut -d ' ' -f1
+ target_addr=10.10.3.220
+ echo 'scp /tmp/*.txt root@10.10.3.220:/version'
+ echo 'rm /tmp/*.txt'
+ cat master_loader.template temp2.txt temp4.txt
+ chmod +x ./version_loader.sh
+ rm ./temp1.txt ./temp2.txt ./temp4.txt
+ scp version_loader.sh root@10.10.3.201:/tmp
+ ssh -v root@10.10.3.201 '/tmp/version_*'
OpenSSH_4.2p1, OpenSSL 0.9.8a 11 Oct 2005
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to 10.10.3.201 [10.10.3.201] port 22.
debug1: Connection established.
debug1: permanently_set_uid: 0/0
debug1: identity file /root/.ssh/identity type -1
debug1: identity file /root/.ssh/id_rsa type 1
debug1: identity file /root/.ssh/id_dsa type -1
debug1: Remote protocol version 1.99, remote software version OpenSSH_4.2
debug1: match: OpenSSH_4.2 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_4.2
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-cbc hmac-md5 none
debug1: kex: client->server aes128-cbc hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Host '10.10.3.201' is known and matches the RSA host key.
debug1: Found key in /root/.ssh/known_hosts:1
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,keyboard-interactive
debug1: Next authentication method: publickey
debug1: Trying private key: /root/.ssh/identity
debug1: Offering public key: /root/.ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 277
debug1: read PEM private key done: type RSA
debug1: Authentication succeeded (publickey).
debug1: channel 0: new [client-session]
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = POSIX
debug1: Sending env LC_CTYPE = de_DE.UTF-8
debug1: Sending command: /tmp/version_*
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: channel 0: free: client-session, nchannels 1
debug1: fd 0 clearing O_NONBLOCK
debug1: Transferred: stdin 0, stdout 0, stderr 0 bytes in 0.4 seconds
debug1: Bytes per second: stdin 0.0, stdout 0.0, stderr 0.0
debug1: Exit status 0 <- hängt es damit zusammen?
+ sleep 10
+ rm ./version_master_loader.sh
+ read address type
+ cat /version/ergebnis.txt

Ich habe echt keine Ideen mehr....
 
Irgendwie hab ich in Erinnerung, daß ssh stdin von der bash klaut.
Und damit wird dir der Rest von "< ./version.cfg" geklaut.

Versuch mal:
ssh root@$address "/tmp/version_$type.sh" </dev/null
oder
ssh -n root@$address "/tmp/version_$type.sh"

Haveaniceday
 
OP
J

JoKurt

Member
Ich habe es :D

Damit geht es:

Code:
cat version.cfg | grep -v "#" | while read -r address type
        do
          echo "Connect to:" $address " copy needed files to: "$type
                ifconfig eth0 | grep "addr:" | cut -d ":" -f2 >./temp1.txt
                target_addr=`cat ./temp1.txt | cut -d " " -f1`
                echo "scp /tmp/*.txt root@"$target_addr":/version" > temp2.txt
                echo "rm /tmp/*.txt; rm /tmp/*.sh" > temp4.txt
                cat $type.template  temp2.txt temp4.txt > ./version_$type.sh
                chmod +x ./version_$type.sh
                rm ./temp*
                scp version_$type.sh root@$address:/tmp > /dev/null
                ssh -x -a root@$address "/tmp/version_$type.sh" &
                wait $!
                rm ./version_$type.sh
done

Gruß
JoKurt
 
Oben