我编写了active.ksh脚本(基于expect),以便自动登录某些Solaris机器并执行hostname命令(登录虚拟IP以验证哪个主机名是活动机器 – 我有两个集群solaris机器)
问题在于期待; expect发送密码字符串(pass123)并且它错过了密码问题,它仍然等待密码.
实际上密码后输入了密码(pass123)
题.在大多数情况下,expect脚本工作正常,但有时它会丢失密码.
问题的例子
./active.ksh spawn ssh 10.10.18.61 sh: /usr/local/bin/stty: not found This computer system,including all related equipment,networks and network devices (specifically including Internet access),is provided only for authorized uss Password: * my remark - pass123 string was missed the Password Question pass123 Password:
剧本
#!/bin/ksh VIP_ADDRESS=10.10.18.61 expect_for_verify_which_active_machine=`cat << EOF set timeout -1 spawn ssh $VIP_ADDRESS expect { ")?" { send "yes\r" ; exp_continue } Password: {send "pass123\r"} } expect > {send "hostname\r"} expect > {send exit\r} expect eof EOF` expect -c "$expect_for_verify_which_active_machine"
正确结果的例子
./active.ksh [Friday,February 24,2012 2:32:06 PM IST] INFO Verify which is active SMU machine spawn ssh 10.10.18.61 sh: /usr/local/bin/stty: not found This computer system,networks and network devices (specifically including Internet access),is provided only for authorized uss yes Password: Last login: Fri Feb 24 14:32:06 2012 from smu1a This computer system,is provided only for authorized uss solaris1:/ ROOT > hostname solaris1 solaris1:/ ROOT > exit logout Connection to 10.10.18.61 closed.
解决方法
如果您在登录期间监视字符串,您将希望避免使用“密码:”,您会发现它并不总是大写.
将你的期望改为-re“(.*)assword:”或“assword:”往往会更有效地抓住这条线.
如果你发现时间仍然太快,你可以睡一觉;在你发送之前
这就是我用来期待的东西
expect { "(yes/no)?" { send "yes\n" } "passphrase" { send "\r" } -re "(.*)assword:" { sleep 1; send -- "password\r" } -re $prompt { return } timeout { puts "un-able to login: timeout\n"; return } eof { puts "Closed\n" ; return } }