Я хочу написать сценарий входа в систему 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. Я просто хотел писать псевдокодом.
Я бы выбрал решение из двух частей. Одна часть - это сценарий ожидания, другая - сценарий оболочки.
Для сценария ожидания это должен быть общий сценарий, принимающий ввод и производящий вывод.
Это мой пример ожидаемого сценария, который принимает имя хоста и пароль и создает имя 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
В сценарии оболочки я вызову сценарий ожидания и предоставлю ему переменную, в данном случае имя хоста для vcsystem. Пароль на самом деле представляет собой шаблон в соответствии с именем хоста OA @ XXXX, где XXXX - это последний четырехзначный номер сервера.
[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.