期望超时,在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" 

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\" ") 

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

“expect [[-opts] pat1 body1] … [-opts] patn [bodyn]

一直等到其中一个模式与产生的进程的输出相匹配,指定的时间段已经过去,或者看到文件结束。 如果最后的主体是空的,则可以省略。

来自最新的expect_before命令的模式在任何其他模式之前隐式使用。 来自最近的expect_after命令的模式隐式地用在任何其他模式之后。

如果整个expect语句的参数需要多行,那么所有的参数都可以“加强”成一个,以避免每行都以反斜杠结尾。 在这种情况下,通常的Tclreplace将会发生,尽pipe大括号。

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

如果模式匹配,则执行相应的主体。 expect返回正文的结果(如果没有模式匹配,则返回空string)。 在多个模式匹配的情况下,首先出现的模式用于select一个物体。 …“

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