expect: So verwenden Sie expect-Skripte innerhalb einer Bash-Subroutine

expect: So verwenden Sie expect-Skripte innerhalb einer Bash-Subroutine

Ich möchte ein Login-Skript in expect schreiben. Aber ich möchte, dass es in verschiedenen anderen Skripten wiederverwendet werden kann. Ich möchte alle Login-Befehle zu einem Teil einer Bash-Subroutine machen. d. h. 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 ...
}

daher möchte ich diese Subroutine in einer Datei/Bibliothek platzieren, die von vielen verschiedenen Skripten wiederverwendet werden kann.

Wie kann ich das machen?

Danke

PS: Entschuldigen Sie die ungenaue Syntax von bash/expect. Ich wollte nur im Pseudocode-Stil schreiben.

Antwort1

Ich würde eine zweiteilige Lösung wählen. Ein Teil ist das Expect-Skript, der andere Teil ist das Shell-Skript.

Beim Expect-Skript sollte es sich um ein generisches Skript handeln, das Eingaben akzeptiert und Ausgaben erzeugt.

Dies ist mein Beispiel für ein Expect-Skript, das Hostnamen und 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 rufe ich das Skript expect auf und gebe ihm die Variable, in diesem Fall den Hostnamen für vcsystem. Das Passwort ist eigentlich ein Muster entsprechend dem Hostnamen OA@XXXX - wobei XXXX die letzten vier Ziffern des Servers sind

[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 ungefähr Folgendes tun:

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

Und es wird das VC-Profil für jeden der Server in der Datei serverlist.txt ausgedruckt

verwandte Informationen