target
stdio를 통해 명령/응답 인터페이스를 구현하는 명령줄 프로그램이 있습니다 (사람이 아닌 다른 프로그램에서 작동함).
구체적으로:
- 프로그램 사용자가 프로그램을 시작했습니다.
- 표준 출력("인사말")에서 하나 이상의 라인을 읽습니다.
- 하나 이상의 라인을 표준 입력("명령")으로 보냅니다.
- 표준 출력에서 하나 이상의 라인("응답")을 읽습니다.
- ...
이는 종료될 때까지 루프에서 발생하며 target
일종의 "exit" 명령이 수신될 때 발생할 수 있습니다.
명령과 응답 사이의 지연은 임의적일 수 있습니다. 나는 그것이 target
자체적으로 일부 명령(소비자가 응답해야 함)을 시작할 수도 있다고 생각 하지만 확실하지 않습니다.
모든 명령과 응답을 기록(또는 더 나은 방법으로는 기록하고 수정)할 수 있도록 이 프로그램을 어떤 방식으로 래핑할 수 있습니까?
답변1
몇 가지 가정부터 시작해야 합니다. 특히, 프로그램 중 하나는 대상 프로그램이 이전 명령에 대한 응답 전송을 완료할 때까지 명령을 보내지 않습니다. 그렇지 않으면 동시에 녹음된 내용이 지저분해 보일 수 있습니다. 이 가정이 성립하려면 싱크와 소스 사이에 삽입된 프로그램이 버퍼링을 사용하지 않도록 해야 합니다.
두 가지 솔루션:
1. 하우징 FD가 포함된 이중 T-시트
쉘 스크립트에서는 버퍼링을 비활성화하고(이 사용 사례에서는 매우 중요함) 클라이언트 프로그램의 stdout을 tee -a logfile
파일로 리디렉션한 다음 동시에 tee
stdout을 임시 FD에 연결합니다.
이와 마찬가지로 쉘 구성을 사용하여 클라이언트 프로그램의 표준 입력 역할을 하는 파일 설명자와 프로그램의 표준 출력 역할을 하는 또 다른 파일 설명자를 생성할 수 있습니다 target
. 그런 다음 다른 파이프를 통해 두 설명자에 의해 형성된 "응답" 방향을 파이핑하게 됩니다 tee -a logfile
.
마지막으로 첫 번째 tee
stdout 스트림을 입력으로 사용 target
하고 두 번째 tee
stdin 스트림을 출력으로 사용합니다.
2. 프로세스 디버깅
다양한 방법을 사용하여 대상 또는 클라이언트 프로세스가 읽고 쓰는 내용에 연결하고 이를 기록할 수 있습니다.
적절한 LD_PRELOAD를 사용하면 read
프로그램의 stdin 및 stdout과 상호 작용하는 libc 및 호출을 가로채서 기록할 수 있습니다. write
문제: 모든 것이 libc를 사용하는 것은 아닙니다.
또는 다음이 권장됩니다. bpftools에는 기본 시스템 호출을 캡처하는 청취 예제가 제공됩니다. 이를 해결할 방법은 없습니다. 필터에 표시되는 내용을 기록하세요!