[완료] 리눅스에서 실행 중인 프로세스에 입력을 넣는 방법
글쓴이: martheme / 작성시간: 화, 2010/09/07 - 8:17오후
어떤 프로그램을 실행하는 도중에 표준 입력으로 사용자의 입력을 받는 부분이 있는데,
여기에 스크립트를 이용하여 키보드로는 넣을 수 없는 입력을 넣고자 합니다. (ex. NULL 문자)
문제를 해결하기 위해 제가 가장 먼저 시도해 본 것은
^Z
[1]+ Stopped ./program
Ctrl+z 로 입력 받는 부분에서 일시정지 시켜놓고
$ python -c 'print "\x00"' | fg
이런 식으로 파이프로 입력을 넘겨보았지만 이내 당연히 안되는 것을 깨달았습니다.
글을 잘 못써서 제가 하고 싶은 것이 무엇인지 글에 잘 담겼는지는 모르겠지만 이런 경우에 어떻게 해야 하는지 알려주시면 감사하겠습니다.
expect 같은 걸 사용해보려고 했지만, 문제가 되는 부분에 도달하기 위해 넣어야하는 값들(매번 변함)을 예측할 수 없는 상황이기 때문에 사용할 수 없었습니다.
Forums:
FIFO 사용을 한번 고려해 보세요
---------------------------------------------
git init
git add .
git commit -am "project init"
---------------------------------------------
---------------------------------------------
git init
git add .
git commit -am "project init"
---------------------------------------------
터미널에서 컨트롤-@
터미널에서 컨트롤-@ 를 치면 널문자가 입력된다는군요.
파이프 혹은 쥐디비
이렇게 하시면 echo 명령어에 대한 결과가 program이라는 프로그램의 표준 입력으로 사용됩니다.
아니면 gdb를 이용하셔도 될것 같습니다.
gdb에서 변수의 값을 출력하는데 print를 사용할 수 있지만 메모리에 값을 세팅할 수도 있습니다.
제가 질문을 잘못이해했으면 죄송합니다.
여러 답변에 감사드립니다.
지금 시도해 볼만한 것은 FIFO 군요. 혹시 성공하게 되면 다시 댓글로 달도록 하겠습니다.
Ctrl+@ 가 NULL인건 처음 알았습니다 :)
앗, 그냥 키보드로 바로 넣을 수 없는 값들에 대해 입력을 넣을 수가 있군요.
Ctrl+A 는 0x01이고 Ctrl+B 는 0x02이고... 이런게 있었군요.
다만 확장형 아스키코드에 대해서는 잘 모르겠네요...
아주 오랜 옛적엔
아주 오랜 옛적엔 xterm 도 MS-DOS 콘솔처럼 Alt+키패드숫자키 조합으로 ASCII 문자를 직접 입력할 수 있었습니다.
이 기능이 아직 지원되는 다른 터미널 에뮬레이터를 찾아보거나
리눅스 fb 콘솔로 나가서 실험해보세요.
Ctrl+문자키 조합은 터미널의 설정과 직접적인 관련이 있으니 너무 철썩같이 믿지는 마시고요.
stty -a 명령으로 터미널 설정값들을 볼 수 있고, ^ 로 표시되는 것을 ctrl 키로 이해하시면 됩니다.
OTL
정말
정말 감사합니다.
제가 하려고 했던 것을 완벽하게 할 수 있네요.
비록 일시 정지시킨 프로세스에 대해 외부에서 입력을 넣을 방법은 아직 못 찾았지만 이것만으로도 충분하네요.
혼자 3 댓글을 달고 있지만...
대상 프로그램을 제 마음대로 변조할 수 없기 때문에, FIFO의 방법으로는 어려울 것 같습니다.
대상 프로그램이
대상 프로그램이 터미널을 꼭 필요로하는 놈이 아니라면,
정도로 될 것 같은데요. 단지... echo 가 종료되는 시점에 fifo 로 시그널이 갈 테고, program 도 종료되겠죠.
OTL
지금 시도해보았지만...
특수한 값들을 넣어야 되는 상황이 발생하기 이전에는 터미널에 출력되는 값을 보고 그에 맞추어 입력을 넣어야하기 때문에
그 값들을 미리 예측할 수 없는 이상, 처음부터 FIFO로 대상 프로그램에 입력을 넣기는 힘든 것 같습니다. OTL
프로그램이 실행 중인 도중에 FIFO로 입력을 전환할 방법이 있으면 가능할 것 같은데...
mkfifo x ./program <
mkfifo x
./program < x
다른 터미널로
cat > x
한담에 입력은 이 터미널로 하고 출력은 원래 실행시킨 터미널로...
특수문자 입력이 필요하면 터미널 새로 띄어서
python -c 'print "\x00"' > x
이런식으로 하면 될거 같은데요.
댓글 달기