从脚本直接运行命令到另一个进程

时间:2019-03-01 10:58:39

标签: linux bash sh simscript

我目前正在研究与另一个进程进行交互的脚本。 如果相关,则所述过程是simdebug控制台。我想要的是正确退出它,因为当我杀死进程本身时,它会创建一个锁定文件.lck。 Simdebug控制台正在等待输入,并在接收到quit之后关闭,然后依次按下q和n(分别由回车按键来验证命令)。

我设法使用

向Simdebug发送了一些命令
echo quit > /proc/< PID >/fd/1

但是它只打印回显的结果,我找不到发送回车按键的方法,只有新行'\ n'。

我也无法发送直接在Simdebug中执行的退出命令,而不是在发送该命令的终端中执行的退出命令。

如果回答了这两点之一,我的问题就会解决:

  • 是否可以模拟验证按键,如下所示: 术语1:echo ifconfig;回声<输入按键> 然后哪个将执行术语2的读取缓冲区中的内容

  • 有没有办法像

  • 一样在另一个进程中执行命令

第1项:<未知语法> pwd

第2项<显示的是第2项的密码,而不是term1>

不是仅在终端之间运行,而是在读取模式下已经打开的进程。

1 个答案:

答案 0 :(得分:0)

这实际上是一个困难要做的事情。如果您从其他主终端向/ proc / self / fd / 0设备或类似的stdin设备链接发送字符,则它将仅将字符输出到其他进程的主终端的输出侧。

使用expectpdipscreen之类的工具,您可以将所需的任何内容发送到封装在其伪终端中的进程,就好像它来自其主终端一样。但是,如果某个进程正在运行,那么它将已经拥有自己的终端。

如果可以说服控制台使用reptyr进行控制性终端传输,那么您会很幸运。

例如,如果您的控制台具有进程ID 999999(并且您已经安装了screenreptyr,并且也许做了某些事情来安抚selinux或apparmor / yama保护):

screen -dmS automateconsole
screen -S automateconsole -p 0 -X stuff 'reptyr 999999^M'
screen -S automateconsole -p 0 -X stuff 'quit^M'
sleep 1s
screen -S automateconsole -p 0 -X stuff 'q^M'
sleep 1s
screen -S automateconsole -p 0 -X stuff 'n^M'
sleep 1s
screen -S automateconsole -p 0 -X stuff 'exit^M'

但请注意:

  • 您可能应该清理初始化控制台的程序。
  • 至少在Ubuntu上,我无法reptyr从其他SSH会话进行进程。

https://github.com/nelhage/reptyr

http://theterminallife.com/sending-commands-into-a-screen-session/