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

1

Eu quero escrever um login script em espera. Mas quero que isso seja reutilizado em outros scripts diferentes. Eu quero fazer 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 reutilizada por muitos scripts diferentes.

Como posso fazer isso?

Obrigado

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

    
por user285825 11.09.2013 / 22:01

1 resposta

0

Eu gostaria de uma solução de 2 partes. Uma parte é o script expect, a outra parte é o script Shell.

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

Este é o meu exemplo de script de espera que aceita nome de host e senha, e produzirá o nome do 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 script de shell, chamarei o script expect e forneci-o com a variável, nesse caso, o nome do host para vcsystem. A senha é na verdade um padrão de acordo com o nome do host OA @ XXXX - onde o 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 essa solução de duas partes, posso fazer algo assim:

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

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

    
por 10.11.2015 / 14:46

Tags