在 Bash 脚本中预期超时

在 Bash 脚本中预期超时

如何在以下脚本中添加“expect”的超时?我想将其设置为 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"

答案1

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

根据以下对 expect 手册页的摘录:

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

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

最近的 expect_before 命令中的模式会在其​​他任何模式之前隐式使用。最近的 expect_after 命令中的模式会在其​​他任何模式之后隐式使用。

如果整个 expect 语句的参数需要多行,则所有参数可以“括起来”放在一行中,以避免以反斜杠结尾每行。在这种情况下,尽管有括号,但通常的 Tcl 替换仍会发生。

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

如果模式匹配,则执行相应的主体。expect 返回主体的结果(如果没有匹配的模式,则返回空字符串)。如果有多个模式匹配,则使用第一个出现的模式来选择主体。...“

答案3

@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"

相关内容