【问题标题】:Expect script conditional scenario [duplicate]期望脚本条件场景[重复]
【发布时间】:2016-12-21 06:50:18
【问题描述】:

我正在尝试使用 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 个期望条件。在大多数情况下,Expect 3 是唯一满足的条件。

在主机身份已经存在的系统中,expect 脚本执行第一个条件并一直保持到超时,并且不会达到期望 3。我不知道如何实现这一点,但是否有如果未满足提示,则希望中断。

【问题讨论】:

  • expect 不是 bash 的一部分,它不是特定于 bash,它不随 bash 一起提供,它甚至不使用 bash 底层(它基于的语言是 TCL)。您可以在根本没有安装 bash 的情况下运行期望脚本。 bash 标记在特定于预期的问题中没有位置。
  • 谢谢,expect 命令本身并不是脚本中的 bash。我希望执行的 script.sh 是一个 bash 脚本,但这就是我调用 bash 可执行文件的原因

标签: expect


【解决方案1】:

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 分钟才能继续,此时,您的系统可能会超时,然后才能执行下一个expect 命令。

祝你好运。

【讨论】:

  • /home/user/script.sh 需要大约 60 秒来执行,最坏的情况我希望脚本失败,如果它超过 120 秒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多