특정 실행 파일의 입력 및 출력을 가로채기

특정 실행 파일의 입력 및 출력을 가로채기

일부 계산을 수행하기 위해 더 큰 응용 프로그램에서 호출되는 특정 Linux 실행 파일이 있습니다. 먼저 실행 파일을 호출하는 방법과 매개변수 및 데이터가 전송되는 방식을 이해해야 하기 때문에 계산이 수행되는 방식을 수정하고 싶습니다.

따라서 이 실행 파일이 호출되면 명령줄 인수인 stdin 및 stdout을 모니터링하고 싶습니다. 실행 파일의 정상적인 작동을 방해해서는 안 됩니다.

이 작업을 수행하는 쉬운 방법이 있나요?

고쳐 쓰다:

다음 스크립트를 사용하여 모든 데이터를 가져오기 위해 쉘 스크립트 자리 표시자 아이디어를 사용해 보았습니다.

#!/bin/bash
export LOGFILE=/tmp/logname
echo `env` > $LOGFILE-env
echo "$@" >> $LOGFILE-arguments
tee -a $LOGFILE-stdin | /path/to/real/executable 2>&1 | tee -a $LOGFILE-stdout

이는 테스트 입력에는 잘 작동하지만 실제로 호출되면 중단됩니다. 어쩌면 내가 생각했던 것보다 더 많은 일이 벌어지고 있을지도 모른다.

답변1

옵션 1은 호출 애플리케이션의 소스 코드를 수정하고 이를 tee출력 파이프라인에 삽입하여 해당 단계에서 검토할 출력 복사본을 얻는 것입니다.

옵션 2는 관련 실행 파일 주위에 래퍼 스크립트를 작성하는 것입니다. 표준 입력과 인수를 실제 애플리케이션에 전달한 다음, 애플리케이션이 단 몇 줄의 코드로 시작할 수 있어야 하는 것처럼 사용자가 보고 뱉어낼 수 있는 출력을 어딘가로 보내는 빠른 스크립트입니다. 특별한 위치에 배치하고 해당 위치를 PATH 변수 앞에 추가한 다음 애플리케이션을 실행합니다.

#!/bin/sh
cat - | /path/to/realapp $@ | tee /tmp/debug_output

답변2

전화로 프로그램에 대한 많은 정보를 얻을 수 있습니다.strace. 이는 프로그램이 수행한 모든 시스템 호출을 보여줍니다. 때로는 너무 유익할 수도 있지만 문제가 있는 위치를 찾는 데 큰 도움이 될 수 있습니다.

방법 1은 에 있습니다 strace. 이렇게 하면 출력이 많아지고 애플리케이션 속도가 느려질 수 있습니다.

strace -s9999 -efile,process -f -o bigapp.strace bigapp

대규모 애플리케이션이 대화형이라면 이를 시작하고 계산을 실행할 준비가 되면 strace를 연결하는 것이 좋습니다. 애플리케이션의 프로세스 ID(예: 12345)를 기록한 후 다음을 실행하세요.

strace -s9999 -efile,process -f -o bigapp-calculations.strace -p12345

외부 실행 파일을 관찰하는 것만으로도 충분하다면 다른 답변실행 파일을 래퍼 스크립트로 대체해야 한다는 제안이 있었습니다. 실행 파일을 다른 이름으로 이동하고 그 자리에 래퍼 스크립트를 넣거나, 일반적인 실행 파일 앞에 래퍼 스크립트를 넣거나, PATH편리하다면 일반적으로 사용되는 실행 파일 대신 래퍼 스크립트를 호출하도록 애플리케이션을 구성할 수 있습니다. 래퍼 스크립트 만들기

#!/bin/sh
exec strace -s9999 -efile -o auxapp-$$.strace /path/to/original/executable "$@"

사용된 추적 매개변수에 대한 설명:

  • -e선택하다시스템 호출길. 이름으로 시스템 호출을 지정하거나 file( open, close, read, write, ...) 및 process( fork, execve, ...) 와 같은 일부 범주를 사용할 수 있습니다 .
  • -fstrace가 따라오도록 하세요포크즉, 원본 프로세스뿐만 아니라 하위 프로세스도 추적합니다.
  • -o추적이 포함된 파일의 이름을 선택합니다. $$셸 프로세스의 프로세스 ID를 나타내는 셸 구성입니다( exec마지막 래퍼 스크립트에서 사용되었으므로 도우미 애플리케이션의 프로세스 ID이기도 함).
  • -s9999sum 및 기타 호출의 바이트를 표시하도록 만듭니다 read.write

답변3

경로를 변경해서는 안 되며, 관심 있는 바이너리를 "binary"에서 "binary.orig"로 이동하고 스크립트로 교체하세요. 당신은 이러한 매개변수에 관심이 있어서 이를 파일에도 쓰고 싶다고 말했습니다. "env" 명령의 출력에 관심이 있을 수도 있습니다. 현재 활성화된 모든 환경 변수를 덤프합니다. 한 프로그램은 종종 환경 변수를 사용하여 자신이 호출하는 다른 프로그램의 동작에 영향을 줍니다.

답변4

다음은 나에게 효과적이었습니다.

cat-|tee/tmp/in.log | /path/to/realapp$@ |tee/tmp/out.log

관련 정보