我想在 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
我会选择两部分解决方案。一部分是期望脚本,另一部分是 Shell 脚本。
对于期望脚本,它应该是一个接受输入并产生输出的通用脚本。
这是我的示例期望脚本,它接受主机名和密码,并将为服务器生成 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
在 shell 脚本中,我将调用 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
它会在 serverlist.txt 文件中打印出每个服务器的 vcprofile