터미널 에뮬레이터에서 의사 터미널의 마스터 측에 대한 fd입니다. 그 마스터 fd는 실제 터미널로가는 와이어를 시뮬레이션하는 것입니다. xterm
그것에 쓰는 것은 당신이 누르는 키에서 생성 된 문자입니다. 읽은 내용이 표시됩니다.
예를 들어, Linux에서 :
$ lsof -ac xterm /dev/ptmx
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
xterm 15173 chazelas 4u CHR 5,2 0t0 2131 /dev/ptmx
그런 다음 예를 들어 실행하십시오.
stty -echo -opost
strace -e read -e read=4 -p15173 2>&1 | stdbuf -o0 sh -c '
grep "^ |" | cut -b11-60 | tr -d " " | xxd -r -p'
물론 모니터하려는 터미널과 동일한 유형 및 크기의 터미널에서 실행하면 더 효과적입니다. 크기는 다음과 같습니다.
stty size < /dev/pts/that-terminal
터미널의 마스터 측에서 읽은 내용 xterm
을 덤프 하므로 표시 echo
되는 내용 의 로컬 을 포함하여 표시 되는 내용이 덤프 됩니다 .
는 -e read=4
위입니다 strace
무엇의 16 진 덤프 출력 xterm
의 FD 4. 명령의 나머지 읽기는 실제 문자가 변환하는 것입니다. 나는 시도 peekfd -n -8 15173 4
했지만 어떤 이유로 쓰여지고있는 것을주었습니다.
우리가 사용하고있는 -opost
그 모든 것을, 그래서 우리는 터미널 모니터링에 사후 처리를 사용하지 않도록 xxd
우리의 모니터링이 그래서, 슬레이브 측에 쓰기가 우리의 마스터 측에이 변화하게 xterm
(가) 하나를 감시 같은 일을 가져옵니다. -echo
모니터링되는 터미널의 응용 프로그램이 터미널에서 응답을 요청하는 이스케이프 시퀀스 (예 : 커서 위치 또는 터미널 유형 또는 창 제목을 요청하는 이스케이프 시퀀스)를 보내면 모니터링 xterm
및 xterm
의사 결정에 도움이됩니다. 회신하십시오. 우리는 그 지역의 반향을 원하지 않습니다.
또한 추적하여 무엇이 입력되고 있는지를 모니터링 할 수있다 write
(대체 같은 FD에 시스템 호출 read
로 write
위). 를 누르면 Enter터미널 에뮬레이터가 LF가 아닌 CR 문자를 보냅니다. 또한 마스터 측에서 추적하기 때문에 사용자가 a<Backspace>b
입력하면 터미널 장치가 표준 모드 인 경우에도 세 번의 키 입력이 모두 표시됩니다.
왜 작동하지 않는지에 관해서 :
tee /dev/pts/user_pts </dev/pts/user_pts
터미널 장치에서 읽는 것은 사용자 입력을 읽고 있으며, 쓰는 것은 사용자에게 표시하는 것입니다.
당신은 이야기하고 tee
, 단말 장치에서 읽을 수 있습니다. 따라서 읽은 것 (사용자 입력)은 read
터미널에서 실행되는 응용 프로그램 ( tee
및 그 반대로 )이 아니며 application
터미널 입력을 위해 싸울 것입니다. 터미널 장치에 쓰는 것은 거기에 표시하기위한 것이며 입력으로 다시 넣는 것이 아닙니다. 당신이 할 때
echo test
( echo
stdout이 터미널 인 경우) 입력 한 것과 동일하지 않습니다 test
.
이 인 ioctl
( TIOCSTI
) 넣어 문자 입력으로 백업하지만, 심지어 정말 일이 다시 넣을 수 없습니다 때문에 이후에 이미 좀 더 읽기로 응용 프로그램이 입력을 읽고 순서를 변경 할 수 있도록, 응용 프로그램, 그리고 어떤 식 으로든, 그것은 당신이 그것을 반복해서 읽을 것이라는 것을 의미합니다.
ttysnoop
아마 또는 아마peekfd
.