我正在运行一个 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