如何在以下脚本中添加“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"