#!/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"))
')
Мне не нравится, что аргумент скрипта может быть C-инъекцией.