类似的问题似乎还有很多,例如:
然而给出的答案是通过将其标准输入设置为管道来预先准备程序。
还有:
这是通过命令运行相关程序的终端多路复用器来回答的。这意味着它也需要事先准备。
这个问题是关于如何做到这一点没有事先做好任何准备。
起初我认为这可能很简单:
echo foo > /proc/$p/fd/0
但这只是写入终端。然后我尝试了:
echo foo > /proc/$terminal_emulator/fd/$ptmx_fd
但这也失败了,因为它只是为回显打开了一个新的终端设备从属设备。
我已经使用gdb
(叹)我将在下面发布,但我想知道是否有人知道更简单更好的替代方案。
答案1
#!/usr/bin/zsh
pid="$1"
stdin_data="$2"
for p in $(pstree -sp "$pid" | grep -Po '(?<=\()\d+(?=\))' | tac); do
[[ -r "/proc/$p/fd" ]] || continue
for f in /proc/$p/fd/*; do
if [[ "$(readlink "$f")" = /dev/ptmx ]]; then
fd="$(basename "$f")"
break 2
fi
done
done
sudo gdb -p "$p" --batch -x =(printf '%s' '
p (int)write($fd, "$stdin_data", (int)strlen("$stdin_data"))
')
我不喜欢 script 参数可以是 C 注入。
答案2
显然你不能,写入进程的标准输入文件不会使进程读取你附加的内容。请参阅此答案以获得完整的解释:https://serverfault.com/a/962956