期望脚本不能为ssh的for循环工作

时间:2017-01-31 23:31:56

标签: ssh foreach expect spawn

我正在尝试运行expect脚本,它在主机名中执行foreach循环,然后ssh进入节点并获取技术支持。每个节点都有可变时间在技术支持上产生输出。

Usage: 
  ./test.sh admin password

Filename: hostnames.txt
            node1

脚本:test.sh

#!/usr/bin/expect
set exp_internal 1
set timeout 4
set user [lindex $argv 0]
set password [lindex $argv 1]
set rootdir /home/$user
set f [open "$rootdir/hostnames.txt"]
set hosts [split [read $f] "\n"]
close $f
log_user 1

foreach host $hosts {
 puts $host
 spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no -oUserKnownHostsFile=/dev/null "$user@$host"
 expect "*assword: "
 send "$password\r"
 expect "#"
 send "file md /TS/\r"
 expect "#"
 send "admin tech-support /TS/$host.ts1\r"
 expect "#"
 sleep 180
 expect "#"
 send "logout\r"
 expect eof
 close $spawn_id
}

我得到的错误如下所示,hostnames.txt文件中只有节点,但是一旦在node1中完成了techsupport,它就会返回错误。因此,如果在hostnames.txt文件中添加

,则不确定是否要为另一个节点运行
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no -oUserKnownHostsFile=/dev/null admin@
ssh: : Name or service not known
send: spawn id exp6 not open
while executing
"send "$password\r""
("foreach" body line x)
invoked from within
"foreach host $hosts {
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no -oUserKnownHost..."
(file "./test4.sh" line x)

1 个答案:

答案 0 :(得分:1)

拆分为您提供了一个包含两个条目的列表:hostnames.txt中直到换行符的行,然后是换行符后面的空字符串。您需要测试$ host是否为非空字符串。

向hostnames.txt添加另一行,并确保它对第二个主机的行为正常。如果您没有其他测试节点,您想尝试此操作,而是添加一个重复的行读取“node1”,并看到循环的两个迭代执行相同的操作。