linux - 如何在后台运行 eval spawn ssh 和 expect?

标签 linux bash shell tcl expect

我创建了一个脚本,使用 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/

相关文章:

linux - 我的 bash 脚本在终止命令后不会执行命令

linux - 为命令 Linux shell 脚本创建参数

linux - 在 bash Shell 中查找和替换

C++ 文件/目录统计变量

linux - 如何设置父进程的工作目录?

node.js - 为什么我的 npm 包命令不起作用?

bash - 从 BASH 中的变量中删除 %0D

linux - "tail -f"alternate 不滚动终端窗口

c - 用C语言区分linux上的文件和目录

Bash:以编程方式获取命令的完成输出(例如,在变量中)