我创建了一个脚本,使用 ssh
进入接入点 (AP) 并执行一些命令,我使用 expect
与 shell 交互。
脚本在前台运行时运行良好,但当我尝试在后台使用 &
fork 进程时执行相同的脚本,它在 spawn ssh
在下面的 ap_commands
脚本中执行命令。
尝试执行:
$ run_ap &
Bash 脚本 (run_ap
) 调用 expect 脚本:
#!/bin/sh
while(true); do
/script/ap_commands
done
Tcl 和 expect 脚本(ap_commands
):
#!/usr/bin/expect
eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no user@192.168.92.1
#use correct prompt
set prompt ":|#|\\\>"
set user ">"
interact -o -nobuffer -re "Password:" return
send "pass12345\r"
更新 1 - 解决方案
感谢 Donal Fellows,我解决了使用 screen 命令创建新终端并在前台执行脚本的问题。
screen -dm bash ./run_ap
然后我将 -f
参数添加到 expect
,以强制在前台运行:
#!/usr/bin/expect -f
最佳答案
interact
命令将不与后台脚本一起工作,因为它明确期望与用户交互(以及 spawn
ed 子进程);当interact
发生了,如果进程不在前台,操作系统会给它一个信号(SIGTSTP),停止并等待用户将其设为前台进程。这是通常的 Unix 终端处理。
如果你想使用背景,你需要坚持expect
正在做事情。
关于linux - 如何在后台运行 eval spawn ssh 和 expect?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32074572/