![expect: como usar scripts expect de dentro de uma sub-rotina bash](https://rvso.com/image/617806/expect%3A%20como%20usar%20scripts%20expect%20de%20dentro%20de%20uma%20sub-rotina%20bash.png)
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