expect:如何在 bash 子程序中使用 expect 脚本

expect:如何在 bash 子程序中使用 expect 脚本

我想在 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

相关内容