期待脚本+适合期望,以防不需要密码

时间:2012-02-27 10:19:54

标签: linux bash shell ksh expect

当Linux机器的IP IP登录后询问密码时,以下期望脚本正常工作

但是在某些情况下,某些Linux机器不需要ssh的密码(我们可以在没有密码的情况下登录),

所以我需要更改我的期望脚本以支持没有密码的机器

请建议如何使用我的期望脚本以支持带密码的机器和没有密码的机器

 * target of the following expect script is to check the hostname on remote Linux machine


 expect_test=`cat << EOF
 set timeout -1
 spawn  ssh $IP  hostname
       expect {
                 ")?"   { send "yes\r"  ; exp_continue  }
                 word:  {send "pass123\r"     }
      }
 expect eof
 EOF`



 expect -c "$expect_test"

远程机器上的exe示例(带密码)(远程机器名称 - Linux1_machine)

  IP=10.17.18.6

  expect -c "$expect_test"

  spawn ssh 10.17.18.6 hostname
  sh: /usr/local/bin/stty: not found
  This computer system, including all related equipment, networks and network devices     (specifically including Internet access),is pros
  yes
  Password: 
  Linux1_machine

示例当我们在不需要登录密码的机器上执行expect脚本时

 IP=10.10.92.26


 expect -c "$expect_test"


 spawn ssh 10.10.92.26 hostname
 sh: /usr/local/bin/stty: not found
 Linux15_machine
 expect: spawn id exp5 not open
 while executing
 "expect eof"

1 个答案:

答案 0 :(得分:2)

你有几个选择。

如果您知道服务器的内容,您不必登录(例如会话直接进入提示),然后添加一个expect语句:

expect {
                     ")?"   { send "yes\r"  ; exp_continue  }
                     word:  {send "pass123\r"     }
                     "prompt"    { do something }
          }

如果您没有一致的提示,可以try using a Regular Expression检测各种提示:

set prompt “(%|#|\\$) $” ;# default prompt
expect {
      ")?"   { send "yes\r"  ; exp_continue  }
      word:  {send "pass123\r"     }
      -re $prompt { do something }
}

如果你根本不知道你会得到什么(似乎不太可能),那么你也可以在Expect超时时添加一个动作。

expect {
                 ")?"   { send "yes\r"  ; exp_continue  }
                 word:  {send "pass123\r"     }
                 timeout { do something }
      }

,当它没有收到其他预期的行时,它将允许移动。

有关您要执行的操作的具体示例,请参阅http://wiki.tcl.tk/11583。此外,Getting Started with Expect chapter from the Oreilly book值得一读。