fragen stichworte

expect: wie man Skripte aus einer Bash-Subroutine erwartet

Ich möchte ein Login-Skript in expect schreiben. Aber ich möchte, dass dies in verschiedenen anderen Skripten wiederverwendet wird. Ich möchte alle Login-Befehle Teil einer Bash-Unterroutine machen. dh statt

expect_login.sh
#!/bin/usr/expect -f
spawn ....
set ....

Ich will das:

expect_login
{
    # put some necessary command to initiate expect program

    spawn ...
    set ...
}

Ich möchte diese Unterroutine in eine Datei/Bibliothek stellen, die von vielen verschiedenen Skripten wiederverwendet wird.

Wie kann ich das tun?

Danke

PS: Entschuldige meine ungenaue Syntax von bash/expect. Ich wollte nur im Pseudocode schreiben.

antworten

Ich würde für 2-teilige Lösung gehen. Ein Teil ist das Expect-Skript, der andere Teil ist das Shell-Skript.

Für das expect-Skript sollte es ein generisches Skript sein, das Eingaben akzeptiert und Ausgaben erzeugt.

Dies ist mein Beispiel-expect-Skript, das den Hostnamen und das Passwort akzeptiert und den vcprofile-Namen für den Server

erzeugt  
[user@server ~]$ cat getvcprofile.expect
#!/usr/bin/expect

set timeout 2

set host [lindex $argv 0]

set password [lindex $argv 1]

spawn ssh "ADMIN\\@$host"

expect_after eof { exit 0 }

expect  "yes/no" { send "yes\\r" }

expect  "assword" { send "$password\\r" }

expect "oa>" { send "show vcmode\\r" }

expect "oa>" { send "exit\\r" }

exit

Im Shell-Skript werde ich das expect-Skript aufrufen und es mit der Variable versehen, in diesem Fall dem Hostnamen für vcsystem. Das Passwort ist tatsächlich ein Muster entsprechend dem Hostnamen OA @ XXXX - wobei XXXX die letzte 4-stellige Nummer des Servers ist  

[user@server ~]$ cat getvcprofile.sh
#/bin/bash

# get VC profile for a host

host=$1

#get the blade enclosure
enclosure=`callsub -enc $host |grep Enclosure: | cut -d" " -f2`

if [ ! -z $enclosure ]; then

#get the last 4 digit of the enclosure
fourdigit=${enclosure: -4}

domain=`./getvcprofile.expect ${enclosure}oa OA@${fourdigit} |grep Domain|awk '{print $NF}'`
echo $domain

else

echo "None"

fi

Mit dieser zweiteiligen Lösung kann ich so etwas machen:

for X in `cat serverlist.txt`; do echo -n $X": "; ./getvcprofile.sh $X; done

Und es wird das vcprofile für jeden Server in der Datei serverlist.txt

ausdrucken