期待脚本条件方案

时间:2016-08-15 03:00:22

标签: expect

我正在尝试使用expect实用程序来自动执行需要在脚本执行期间输入密码的任务。

expect -c "set timeout 120; 
spawn /bin/bash /home/user/script.sh; 

# Expect 1 - not expected always
expect \"Are you sure you want to continue connecting (yes/no)?\"; send "yes\r"; 

# Expect 2 - not expected always
expect \"Please type 'yes' or 'no':\"; send \"yes\r\"; 

# Expect 3 - this is required always to input the password
expect \"user@xyz.com's password:\"; send \"password\r\"; expect eof"

从上面的脚本中,始终不需要1和2个条件。只有在针对新服务器执行脚本时才需要它。将主机的标识添加到已知主机后,脚本将不会提示前2个预期条件。在大多数情况下,期望3是唯一可以满足的条件。

在主机身份已经存在的系统中,expect脚本执行第一个条件并一直持续到达到超时并且没有达到预期3.我不知道如何实现这一点,但是如果没有达到提示,有一种方法可以打破。

1 个答案:

答案 0 :(得分:3)

expect命令有一个超时,我忘记了多久,但只是几秒钟。如果找不到您所期望的结果,则会发生超时并且expect命令将退出。考虑到这一点,我已将超时设置为1秒,似乎有效。您可能希望将其调整为您的系统。

#!/usr/bin/env tclsh
package require Expect

spawn /bin/bash /home/user/script.sh 

# Time out (in seconds) for the expect commands
set timeout 1

expect "Are you sure you want to continue connecting (yes/no)? " { send "yes\r" }
expect "Please type 'yes' or 'no':" { send "yes\r" }
expect "user@xyz.com's password:" { send "password\r" }
interact

几点说明:

  1. 此脚本不是bash脚本。它是一个带有Expect包的TCL脚本。我建议这样做,因为TCL很有能力,但不太难学。
  2. timeout值是此处的关键。您甚至可能希望在每个expect命令之前设置不同的超时值,以定制脚本的响应时间。
  3. timeout设置为120太长:每个expect命令都必须等待2分钟再继续,此时,系统可能会超时,然后才能到达下一个{{ 1}}命令。
  4. 祝你好运。