期望脚本可以独立运行,而不是通过 bash 脚本

期望脚本可以独立运行,而不是通过 bash 脚本

我正在运行一个 expect 脚本,它登录到服务器检查 iptables 是否正在运行并返回状态日志文件。还有一个主机文件,其中还提供了服务器列表和密码,expect 是从 shell 脚本调用的,它发送了正确的参数;单独运行这些参数我也可以执行 expect 脚本,但它不能协同工作。主机文件如下:

cat hostfile
10.20.52.167|abcdef
10.20.52.138|zyxwvu

正在执行的 shell 脚本:

cat iptables
#! /bin/bash
#!/usr/bin/expect -f
while read line
do
ipaddress=`echo $line | awk -F'|' '{print $1}'`
password=`echo $line | awk -F'|' '{print $2}'`
echo "./testcase_3 $ipaddress \"$password\" "
sleep 5
done < hostfile

最后是期望脚本:

cat testcase_3
#!/usr/bin/expect -f
#! /bin/bash

set timeout 60
set host [lindex $argv 0]
set password [lindex $argv 1]
log_user 1
set user subhasish
set logfile output.txt
foreach host $host password $password {
spawn ssh $user@$host
expect "*?assword:*"
send -- "$password\r"
sleep 2
expect "$"
send -- "sudo su\r"
expect -gl {*password for subhasish:*}
send -- "$password\r"
expect "#"
send -- "service iptables status\r"
log_file /home/subhasish/output.log
expect "#"
log_file
}
send -- "exit\r";
send -- "exit\r";
exit 0

我不知道哪里出了问题,请帮忙。iptables 脚本发送的参数类似于“./testcase_3“******” “,如果我在命令行中运行它,它可以通过创建 output.log 来实现预期的效果。但是,如果我直接运行 iptables 脚本,什么也不会发生……

答案1

很难说,因为正如你所说,iptables它没有调用 expect 脚本。要调试 expect 脚本,请在顶部附近添加以下内容:exp_internal 1

由于如果提供了正确的字段分隔符,shell 的 read 命令可以抓取多个单词,因此我会编写如下 bash 脚本:

while IFS='|' read ipaddress password; do
    echo "./testcase_3 $ipaddress \"$password\""
    ./testcase_3 "$ipaddress" "$password"
    sleep 5
done < hostfile

相关内容