2016-08-15 79 views
1

我正在尝试使用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 \"[email protected]'s password:\"; send \"password\r\"; expect eof" 

从上面的脚本中,期望1和2条件并不总是必需的。它仅在对新服务器执行脚本时需要。一旦主机的身份被添加到已知主机,脚本就不会提示前2个预期条件。期望3是大多数情况下要满足的唯一条件。

在一个系统中,主机标识已经存在,期望脚本执行第一个条件并保持到达到超时并且不会期望3.我不知道如何实现这个,但是在那里如果没有达到提示,这种方法可能会中断。

+3

http://stackoverflow.com/q/1538444/1005215 –

+1

期望不是bash的一部分,它不是特定于bash,它不随bash一起发运,它甚至不使用bash引擎它基于的语言是TCL)。你可以在没有安装bash的情况下运行expect脚本。 bash标签在特定问题中没有地位。 –

+0

谢谢,期望命令本身不是根据脚本bash。我想要执行的script.sh是一个bash脚本,但是这就是为什么我要调用bash可执行文件 – user6930

回答

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 "[email protected]'s password:" { send "password\r" } 
interact 

有两点要注意:

  1. 这个脚本是不是一个bash脚本。这是一个带有Expect包的TCL脚本。我建议这样做,因为TCL非常有能力,但不太难学。
  2. timeout值是这里的关键。您甚至可能希望在每个expect命令之前设置不同的超时值以定制脚本的响应时间。
  3. timeout设置为120太长:每个expect命令都需要等待2分钟才能继续,此时,系统可能会超时,然后才能进入下一个expect命令。

祝你好运。

+0

/home/user/script.sh需要大约60秒才能执行,最糟糕的情况是我希望脚本失败,如果它超过120秒。 – user6930