我编写了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 }
- }