事前準備なしで他の端末で実行されているプロセスの端末装置stdinにどのように書き込むことができますか? [コピー]

事前準備なしで他の端末で実行されているプロセスの端末装置stdinにどのように書き込むことができますか? [コピー]

次のような似たような質問がたくさんあるようです。

https://stackoverflow.com/questions/5374255/how-to-write-data-to-existing-processs-stdin-from-external-process

しかし、与えられた答えは、標準入力をパイプに設定してプログラムを事前に準備することです。

さらに:

https://serverfault.com/questions/178457/can-i-send-some-text-to-the-stdin-of-an-active-process-running-in-a-screen-sessi

これは、関連プログラムを実行する端末マルチプレクサに対してコマンドを実行することで応答します。つまり、事前準備も必要です。

この質問はこれを行う方法についてです。いいえ事前に準備してください。

最初はこれが簡単だと思いました。

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を注入できるということは好きではありません。

おすすめ記事