次のような似たような質問がたくさんあるようです。
しかし、与えられた答えは、標準入力をパイプに設定してプログラムを事前に準備することです。
さらに:
これは、関連プログラムを実行する端末マルチプレクサに対してコマンドを実行することで応答します。つまり、事前準備も必要です。
この質問はこれを行う方法についてです。いいえ事前に準備してください。
最初はこれが簡単だと思いました。
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"))
')
私はスクリプトパラメータにCを注入できるということは好きではありません。
答え2
明らかにできません。プロセスの標準入力ファイルに書き込むと、プロセスが追加した内容は読み込まれません。完全な説明については、次の回答をご覧ください。https://serverfault.com/a/962956