ubuntuusers.de

Expect Script

Status: Ungelöst | Ubuntu-Version: Ubuntu 15.10 (Wily Werewolf)
Antworten |

aramis_1

Anmeldungsdatum:
22. Januar 2016

Beiträge: 4

Hallo zusammen,

als aller erstes muss ich mal ein dickes Lob an euch alle hier im Forum und allen die am Wiki arbeiten aussprechen. Ich habe vor ein paar Jahren mit Linux im allgemeinen ganz klein angefangen. Und bei Problemen konnte ich immer auf euer bereits geschrieben Hilfen zurückgreifen.

DANKE dass ihr mir wieder viel Stunden googlen und try'n'error erspart habt. Ihr seit die Besten.

Nun habe ich aber ein Problem wo ich keine Hilfe finden konnte. Ich hoffe ihr könnt helfen.

Es geht um folgendes: Ich habe ein shell-script welches Variablen einliest und dann an ein expect-script übergibt dass mir wiederrum eine ssh-Verbindung zu einem jumphost aufbaut. Auf dem jumphost wird in ein tftp Verzeichnis gewechselt. Das klappt allers wunderbar. Nun möchte ich aber in dem Verzeichnis nach einer Datei suchen bzw prüfen ob diese vorhanden ist. Und genau hier habe ich das Problem. Mein Script sucht zwar nach dem File verarbeitet dann aber die expect-Optionen nicht.

Mein Code sieht wie folgt aus:

1
2
3
4
5
6
7
send "cd tftp \n"
expect "username@jumphost01#"
send "ls -la *$file* \n"
expect {
"*No such file*" { send_user "\n File nicht vorhanden \n"; exit 1}
"*file*" {}
}

Der Output sieht wie folgt aus:

username@jumphost01#cd tftp
username@jumphost01#ls -la *testfile.log*
*testfile.log*: No such file or directory
username@jumphost01#

bzw so wenn er dir Datei findet:

username@jumphost01#cd tftp
username@jumphost01#ls -la *testfile.log*
- rwxrwxrwx   1   user   usergroup  12389 JAN 22 2016 testfile.log
username@jumphost01#

Wie bekomme ich mein expect script so hin dass es die vorletzte Zeile auswertet und nicht die letzte? Mir ist bekannt dass ich alles in ein log-file schreiben könnte dann zurück ins shell script und dann wieder mit einem anderen expect-script zurück auf den jumphost um von dort aus weiter zu arbeiten.

Wäre spitze wenn ihr mir helfen könnt

Grüße

euer aramis_1

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11243

Wohnort: München

Was machst du denn mit der gefundenen Datei? Man muss ja nicht zwangsläufig mit ls testen, die Shell hat dafür ja auch eingebaute Methoden:

[ -f *file* ] && echo "A file exists" || echo "No such file"

oder eventuell auch mit find, falls man einen weiteren Befehl für den Treffer auf dem Server ausführen will:

find -maxdepth 1 -name "*file*" -type f -exec echo found file {} \;

aramis_1

(Themenstarter)

Anmeldungsdatum:
22. Januar 2016

Beiträge: 4

Hallo seahawk1986,

Danke für deine Antwort. Kann ich:

[ -f *file* ] && echo "A file exists" || echo "No such file"

direkt in expect ausführen?

Was ich genau tun möchte: Ich prüfe ob die Datei vorhanden ist. Sollte dass nicht der Fall sein, soll ein printout gesetzt werden "file nicht vorhanden" und das expect-script beendet werden. Die Ausgabe "File nicht vorhanden" wird in einem Log-File gelocked. Und dann über das Eingangs-Shell-Script weiterverarbeitet. Sollte die Datei vorhanden sein, wird eine weitere ssh-session von dem jumphost zu einem weiteren Geräte aufgebaut und die Datei dann mittels tftp auf das Gerät kopiert. Es macht in meinen Augen wenig Sinn direkt auf das Gerät zu gehen und dann den tftp load zu starten, wenn nicht sichergestellt ist dass die Datei vorhanden ist. Ich lass mich aber gerne auch hier eines besseren belehren.

Grüße aramis_1

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11243

Wohnort: München

Ich wüsste jetzt nicht, warum man statt

send "ls -la *$file* \n"

nicht auch das senden könnte:

send "[ -f *$file* ] && echo 'A file exists' || echo 'No such file'  \n"

das lässt sich ja leicht ausprobieren, ob das klappt ☺

aramis_1

(Themenstarter)

Anmeldungsdatum:
22. Januar 2016

Beiträge: 4

Also es funktioniert so:

send "\[ -f *$file* \] && echo 'A file exists' || echo 'No such file'  \n"

Das Ergebnis ist dann wenn gefunden "A file exists" bzw. wenn es nicht vorhanden ist "No such file". Jedoch besteht weiterhin das Problem dass mein expect script die "exit route" nicht nimmt und zum shell-script zurückkehrt. Ich vermute dass Problem ist dass hier nicht die vorletzte Zeile auswertet sondern die letze Zeile.

1
2
3
4
5
6
7
send "cd tftp \n"
expect "username@jumphost01#"
send "\[ -f *$file* \] && echo 'A file exists' || echo 'No such file'  \n"
expect {
"*No such file*" { send_user "\n File nicht vorhanden \n"; exit 1}
"*A file exists*" {}
}

Grüße

armais_1

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11243

Wohnort: München

Wenn man nur auf die Existenz einer Datei prüfen will, geht das auch rein mit ssh und ganz ohne expect:

# Führe Befehl auf SSH-Ziel aus, prüfe Exit-Code und führe dann lokal Befehle aus
ssh username@jumphost01 "[ -f tftp/*$file* ]"
case $? in
 0)
    echo "Datei gefunden"
    # kopiere Datei auf Server
    ;;
 1)
    echo "Datei nicht gefunden"; exit 1
    ;;
esac

aramis_1

(Themenstarter)

Anmeldungsdatum:
22. Januar 2016

Beiträge: 4

Ja stimmt dass dürfte gehen. Ich habe nur das Problem dass ich nachher noch das ganze einmal auf einem Cisco IOS Device machen muss. Dort muss ich auch die vorletzte Zeile auslesen :/

Antworten |