![사전 준비 없이 다른 터미널에서 실행 중인 프로세스의 터미널 장치 stdin에 어떻게 쓸 수 있습니까? [복사]](https://linux55.com/image/158498/%EC%82%AC%EC%A0%84%20%EC%A4%80%EB%B9%84%20%EC%97%86%EC%9D%B4%20%EB%8B%A4%EB%A5%B8%20%ED%84%B0%EB%AF%B8%EB%84%90%EC%97%90%EC%84%9C%20%EC%8B%A4%ED%96%89%20%EC%A4%91%EC%9D%B8%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%9D%98%20%ED%84%B0%EB%AF%B8%EB%84%90%20%EC%9E%A5%EC%B9%98%20stdin%EC%97%90%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EC%93%B8%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F%20%5B%EB%B3%B5%EC%82%AC%5D.png)
다음과 같은 비슷한 질문이 많이 있는 것 같습니다.
그러나 주어진 대답은 표준 입력을 파이프로 설정하여 프로그램을 미리 준비하는 것입니다.
게다가:
이는 관련 프로그램을 실행하는 터미널 멀티플렉서에 명령을 수행하여 응답합니다. 즉, 사전 준비도 필요합니다.
이 질문은 이를 수행하는 방법에 관한 것입니다.아니요미리 준비하십시오.
처음에는 이것이 간단할 것이라고 생각했습니다.
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