0

所以,我有这个交互式程序,它在没有屏幕的嵌入式 linux ARM 平台上运行,我无法修改。为了与之交互,我必须通过 ssh 进入嵌入式 linux 发行版,并运行该程序,该程序是某种带有内置命令的自定义命令行,它不会退出,只有 SIGINT 会退出程序。

我试图通过让它在后台运行并通过发送像这样的 SSH 命令使用管道与它通信来自动化它ssh user@host echo "command" > stdinpipe。这部分有效,我在 shell 脚本中提供了一个这样的示例(我不能使用 bash,我只在机器上安装了 ash):

#!/bin/sh

mkfifo somePipe
/proc/<PID>/exe < somePipe 2>&1 &

我现在可以通过像这样写入管道轻松地命令程序

echo "command" > somePipe

它输出终端内的所有内容。问题是,虽然如果我打开了一个 SSH 会话它可以工作,但如果我只像我之前所说的那样逐个发送命令(我在 python 中使用 paramiko 和该exec_command()方法,以防万一,但我没有'认为这无关紧要,我可以使用invoke_session()但我不想处理recv()

所以我想我会将程序的输出重定向到管道。这就是问题出现的地方。我的第一次尝试是这个(请忽略所有内容都以root身份运行并存储在根主文件夹中的事实,这就是我得到它的方式,我现在没有时间让它更干净,而且我不是一个管理软件):

cd /root/binary

mkfifo outpipe
mkfifo inpipe

./command_bin &

# find PID automatically
command_pid=$(ps -a | egrep ' * \.\/command_bin *' | grep -v grep | awk '{print $1}')
/proc/${command_pid}/exe < inpipe 2>&1 & 

 echo "process ./command_bin running on PID ${command_pid}"

仅此一项就在终端本身内起作用。现在,如果我让 SSH 会话保持打开状态并打开另一个终端并键入ssh root@host "echo command > /root/binary/inpipe"代码,则会执行该代码,但随后它将我刚刚键入的命令及其结果输出到另一个保持打开状态的终端。所以这显然不是一个选择,我必须以某种方式捕获输出。

如果我更改./command_bin &程序./command_bin >outpipe &永远不会启动,我不知道为什么,我知道因为$command_pid是空的,我无法找到进程ps -A

现在,如果我替换/proc/${command_pid}/exe < inpipe 2>&1 &/proc/${command_pid}/exe < inpipe &>outpipe &程序启动,我可以在脚本完成运行时写入 inpipe echo "command" > inpipe,但是如果我尝试任何一个cat < outpipetail outpipe它只会挂起,并且什么也不做。我nohup在启动命令时尝试过使用,但它并没有真正帮助。我还尝试使用普通文件而不是 fifo 来重定向输出,但结果完全相同。

我花了一整天的时间在这件事上,但我无法让它工作。为什么这不起作用?另外我可能只是使用一种糟糕的方式来做到这一点,还有其他方法吗?这里唯一需要做的是我必须通过 ssh 连接到开发板,并且命令行实用程序必须保持打开状态,因为它正在与板载设备通信(使用 I2C、OneWire 协议等)。

为了简单起见,我希望能够随时写入程序的标准输入,让它的标准输出到其他地方(一些文件,缓冲区,我不在乎),我可以在任意时间后轻松检索cat、tail 或其他带有 ssh 的命令。

4

0 回答 0