expect: как использовать ожидаемые скрипты из подпрограммы bash

expect: как использовать ожидаемые скрипты из подпрограммы bash

Я хочу написать скрипт входа в expect. Но я хочу, чтобы он использовался повторно в других скриптах. Я хочу сделать все команды входа частью подпрограммы bash. т.е. вместо

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

Я хочу это:

expect_login
{
    # put some necessary command to initiate expect program

    spawn ...
    set ...
}

поэтому я хотел бы поместить эту подпрограмму в один файл/библиотеку, которая могла бы повторно использоваться многими различными скриптами.

Как мне это сделать?

Спасибо

PS: Извините за неточный синтаксис bash/expect. Я просто хотел написать в псевдокодовой манере.

решение1

Я бы выбрал решение из 2 частей. Одна часть — это сценарий ожидания, другая часть — сценарий оболочки.

Для сценария ожидания это должен быть универсальный сценарий, который принимает входные данные и выдает выходные данные.

Это мой пример ожидаемого скрипта, который принимает имя хоста и пароль и создает имя vcprofile для сервера.

[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

В скрипте оболочки я вызову сценарий expect и предоставлю ему переменную, в данном случае имя хоста для vcsystem. Пароль на самом деле является шаблоном в соответствии с именем хоста OA@XXXX - где XXXX - это последние 4 цифры номера сервера

[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

Используя это решение из двух частей, я могу сделать что-то вроде этого:

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

И он распечатает vcprofile для каждого из серверов в файле serverlist.txt.

Связанный контент