如何向运行中的终端进程注入命令并使其执行输出?
向运行中的终端进程注入命令并执行的方法
问题场景
有一个正在运行的终端进程,已获取其PID,希望注入一条命令(如ls)使其运行并在该终端中输出结果。尝试了以下操作:
# 假设目标终端进程在另一个窗口运行 $ echo "ls\n" > /proc/PID/fd/0
但仅在目标终端窗口中打印了字符串,并未执行命令。请问如何向该终端窗口发送命令并模拟按下回车键以执行?
解决方案
直接写入/proc/PID/fd/0只打印不执行的核心原因是:终端的标准输入(fd/0)需要符合终端交互逻辑的输入序列,而echo "ls\n"输出的是转义后的字符串(不是真实换行),或缺少终端识别的“执行触发信号”。以下是两种可靠解决方法:
方法1:用printf发送正确的输入序列
printf能输出真实的控制字符,终端通常把回车+换行(\r\n)识别为命令输入完成的触发信号,执行以下命令:
printf "ls\r\n" > /proc/PID/fd/0
部分终端仅需\n即可触发执行,但\r\n的兼容性更强。
方法2:直接操作终端的伪终端(PTY)设备
终端进程本质关联的是伪终端设备,操作该设备比/proc下的fd更可靠:
- 先查询目标进程对应的终端设备:
ps -p PID -o tty=
执行结果类似pts/2,这就是终端的PTY设备路径。
2. 向该设备写入命令序列:
printf "ls\r\n" > /dev/pts/2
写入的内容会被终端直接当作用户输入处理,自动触发命令执行。
注意事项
- 需拥有足够权限:通常要求与目标终端进程为同一用户,或具备root权限。
- 若目标终端正运行交互程序(如
vim、top),注入的命令会被该程序捕获,无法交给shell执行,需先退出交互程序再操作。
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

