在Bash脚本中预期超时


13

如何在以下脚本中为“期望”添加超时?我想将其设置为120秒。

#!/bin/bash
HOST="localhost"
USER="myuname"
PASS="mypassword"

VAR=$(expect -c "
spawn ssh $USER@$HOST
expect \"password:\"
send \"$PASS\r\"
expect \"\\\\$\"
send \"ls\r\"
expect -re \"$USER.*\"
send \"logout\"
")

echo "==============="
echo "$VAR"

Answers:


13

expect根据其联机帮助页,默认超时为10秒。要将其更改为120秒,请在之前spawn ssh $USER@$HOST添加

set timeout 120

做这个

VAR=$(expect -c "
set timeout 120
spawn ssh $USER@$HOST
expect \"password:\"
send \"$PASS\r\"
expect \"\\\\$\"
send \"ls\r\"
expect -re \"$USER.*\"
send \"logout\"
")

2

根据以下手册页摘录中的期望:

“期望[[-opts] pat1 body1] ... [--opts] patn [bodyn]

等待直到其中一种模式与生成的过程的输出匹配,经过了指定的时间段或看到文件结束为止。如果最终主体为空,则可以省略。

来自最新的Expect_before命令的模式在任何其他模式之前被隐式使用。来自最新的Expect_after命令的模式将在其他任何模式之后隐式使用。

如果整个Expect语句的参数需要多于一行,则所有参数都可以“括起来”为一,以免用反斜杠终止每一行。在这种情况下,尽管有括号,仍会发生通常的Tcl替换。

如果模式是关键字eof,则在文件结束时执行相应的主体。如果模式是关键字超时,则在超时时执行相应的主体。如果不使用超时关键字,则在超时时执行隐式null操作。默认超时时间为10秒,但可以通过命令“ set timeout 30”将其设置为例如30。无限超时可以由值-1指定。如果模式是关键字default,则在超时或文件结束时执行相应的主体。

如果模式匹配,则执行相应的主体。Expect返回正文的结果(如果没有模式匹配,则返回空字符串)。如果有多个样式匹配,则首先出现的样式用于选择主体。...“


1

@DerfK已回答您的问题。我将重构您的脚本进行维护:

#!/bin/bash
export HOST="localhost"
export USER="myuname"
export PASS="mypassword"

script=<<'END_OF_SCRIPT'
    set timeout 120
    spawn ssh $env(USER)@$env(HOST)
    expect "password:"
    send "$env(PASS)\r"
    expect "\$"
    send "ls\r"
    expect -re "$env(USER).*"
    send "logout"
    expect eof
END_OF_SCRIPT

VAR=$(expect -c "$script")

echo "==============="
echo "$VAR"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.