期望超时,在 Bash 脚本中

Bij*_*ijo 14 bash expect

如何在以下脚本中为“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"
Run Code Online (Sandbox Code Playgroud)

Der*_*rfK 13

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

set timeout 120
Run Code Online (Sandbox Code Playgroud)

使这个

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


mdp*_*dpc 5

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

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

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

最近的 Expect_before 命令中的模式在任何其他模式之前隐式使用。最近的 Expect_after 命令中的模式在任何其他模式之后隐式使用。

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

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

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