我正在尝试运行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)
答案 0 :(得分:1)
拆分为您提供了一个包含两个条目的列表:hostnames.txt中直到换行符的行,然后是换行符后面的空字符串。您需要测试$ host是否为非空字符串。
向hostnames.txt添加另一行,并确保它对第二个主机的行为正常。如果您没有其他测试节点,您想尝试此操作,而是添加一个重复的行读取“node1”,并看到循环的两个迭代执行相同的操作。