我编写了一个期望脚本,使用ssh登录到另一台服务器。但是,当我想使用for循环为多个服务器执行相同操作时,它不起作用。 以下是剧本:
#!/usr/bin/expect
match_max 5000
set expect_out(buffer) {}
for i in `cat node_list.txt`
do
node_ip=`echo $i| awk -F"," '{print $1}'`
node_initial_pwd=`echo $i| awk -F"," '{print $2}'`
spawn ssh root@$node_ip
expect {
"*(yes/no)?" {send "yes\r";exp_continue}
"'s password:" {send "$node_initial_pwd\r";exp_continue}
"*current*" {send "$node_initial_pwd\r";exp_continue}
"Enter*" {send "Jan2016!\r";exp_continue}
"Retype*" {send "Jan2016!\r";exp_continue}
"\\\$" { puts "matched prompt"}
}
done
node_list.txt的IP和密码用逗号(,)分隔。
我得到的错误是:
mayankp@mayankp:~/scripts/new$ ./connect-to-server.sh
invalid command name "i"
while executing
"i"
("for" initial command)
invoked from within
"for i in `cat node_list.txt`"
(file "./connect-to-server.sh" line 6)
你能帮助我实现这个目标吗?我知道我正在混淆bash并期待在这里,但我不知道如何在期望中运行循环。
答案 0 :(得分:1)
正如你所说,你在这里混合了shell和Expect语法。 Expect基于Tcl,通用语言命令的文档可以在http://www.tcl.tk/man/tcl/TclCmd/contents.htm找到。
您尝试编写的循环的粗略未经测试的翻译是
set inputchannel [open node_list.txt]
while {[gets $inputchannel line] != -1} {
set fields [split $line ,]
set node_ip [lindex $fields 0]
set node_initial_pwd [lindex $fields 1]
spawn ssh root@$node_ip
...etc...
}