对于循环不工作期望sript

时间:2016-01-28 13:15:49

标签: unix expect

我编写了一个期望脚本,使用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并期待在这里,但我不知道如何在期望中运行循环。

1 个答案:

答案 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...
}