expect: como usar scripts expect de dentro de uma sub-rotina bash

expect: como usar scripts expect de dentro de uma sub-rotina bash

Quero escrever um script de login no expect. Mas quero que isso seja reutilizado em outros scripts diferentes. Quero tornar todos os comandos de login parte de uma sub-rotina bash. ou seja, em vez de

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

Eu quero isso:

expect_login
{
    # put some necessary command to initiate expect program

    spawn ...
    set ...
}

então eu gostaria de colocar esta sub-rotina em um arquivo/biblioteca que seria reutilizado por muitos scripts diferentes.

Como eu posso fazer isso?

Obrigado

PS: Perdoe minha sintaxe imprecisa de bash/expect. Eu só queria escrever em pseudocódigo.

Responder1

Eu escolheria uma solução em 2 partes. Uma parte é o script esperado, a outra parte é o script Shell.

Para o script esperado, deve ser um script genérico que aceite entrada e produza saída.

Este é o meu exemplo de script esperado que aceita nome de host e senha e produzirá o nome vcprofile para o servidor

[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

No shell script, chamarei o script expect e fornecerei a variável, neste caso o nome do host para vcsystem. A senha é na verdade um padrão de acordo com o nome do host OA@XXXX - onde XXXX é o último número de 4 dígitos do servidor

[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

Com esta solução em 2 partes, posso fazer algo assim:

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

E irá imprimir o vcprofile para cada um dos servidores no arquivo serverlist.txt

informação relacionada