답변:
TCP를 통해 또는 Unix 도메인 소켓을 통해 또는 Linux에서 추상 네임 스페이스 의 Unix 도메인 소켓을 통해 X11과 통신 할 수 있습니다 .
DISPLAY가로 host:4
짧게 설정되면 tcp/host:4
클라이언트는 TCP를 사용하여 서버에 연결합니다. TCP 포트는 6000에 표시 번호 (이 경우 6004)를 더한 값입니다.
이 경우 해당 네트워크 스니퍼를 사용 tcpdump
하거나 wireshark
해당 포트의 TCP 트래픽을 캡처하여 트래픽을 캡처 할 수 있습니다 .
때 $DISPLAY
아니라 :4
(짧은 unix/:4
), 다음 클라이언트는 유닉스 도메인 소켓을 사용합니다. 어느 /tmp/.X11-unix/X4
또는 동일한 경로 ABSTRACT 공간 (일반적으로 도시 @/tmp/.X11-unix/X4
의 netstat
출력).
트래픽 캡처는 더 까다 롭습니다.
X 서버가 TCP에서 수신 대기하지만 (오늘날 더 이상 사용하지 않는 경향이있는 경우) 가장 쉬운 방법은 루프백 인터페이스의 포트 6004 대신 네트워크 트래픽 을 변경 DISPLAY
하여 캡처하는 localhost:4
것입니다 :4
.
그렇지 않은 경우, 당신이 사용할 수있는 socat
A와 중간에 사람 TCP 등의 전달을 같은 연결을 받아 유닉스 또는 추상적를 :
socat tcp-listen:6004,reuseaddr,fork unix:/tmp/.X11-unix/X4
당신은 다음 설정할 수 있습니다 $DISPLAY
위해 localhost:4
위와 같이 네트워크 트래픽을 캡처하거나 말과 socat
함께 덤프 -x -v
.
이제 $DISPLAY
unix 도메인 소켓을 사용하는 이미 실행중인 로컬 X 응용 프로그램의 트래픽을 변경 하고 캡처 할 수없는 경우 까다로워집니다.
한 가지 방법은 strace
응용 프로그램이 X 서버와 통신하기 위해 수행하는 보내기 / 받기 시스템 호출을 추적하는 데 사용할 수 있습니다 (또는 Linux가 아닌 경우 시스템에서 동등한 명령).
여기 xterm
에서는 writev()
을 수행 recvfrom()
하고 recvmsg()
파일 설명자 3에 대한 시스템 호출이 수행됩니다. 그래서 할 수 있습니다 :
strace -qqxxttts9999999 -e writev,recvmsg,recvfrom -p "$xterm_pid" 2>&1 |
perl -lne '
if (($t,$f,$p) = /^([\d.]+) (writev|recvmsg|recvfrom)\(3, (.*)/) {
@p = ($p =~ /\\x(..)/g);
$dir = $f eq "writev" ? "O" : "I";
while (@p) {print "$dir $t 0000 " . join(" ", splice @p,0,64000)}
}' | text2pcap -T6000,1234 -Dqt %s. - - | wireshark -ki -
(또는 tshark -Vi -
).
아이디어는 출력에서 전송 / 수신 된 타임 스탬프 및 바이트를 추출하여 에 공급하기 전에이를 포트 6000에 더미 TCP 헤더 추가 로 변환하는 데 strace
사용 됩니다 . 또한 pcap 레코드의 최대 길이에 대한 64kiB 제한을 피하기 위해 패킷을 분할합니다.text2pcap
pcap
-T6000,1234
wireshark
에 대한주의 text2pcap
트래픽 방향의 권리를 얻기에 관해서 제대로 작동하려면, 당신은 Wireshark는 비교적 최신 버전이 필요합니다.
기본 TCP / IP 및 이더넷이 아닌 X11 프로토콜에 주로 관심이 있고 클라이언트 또는 서버 설정을 조정할 수있는 경우 X11 간의 트래픽을 캡처하고 디코딩하도록 특별히 설계된 도구를 사용할 수 있습니다 클라이언트와 X11 서버. wireshark
X11 dissector 와 달리 이러한 도구는 트래픽으로 인해 혼동되어서 완전히 관여하지는 않습니다.
주요한 것은 xscope 인데, 일부 유닉스 나 리눅스 배포판에서 바이너리로 사용할 수 는 없지만 source 에서 쉽게 빌드 할 수 있습니다 .
또는 xtruss 와 xtrace도 있지만 경험이 없습니다.
이러한 모든 도구는 연결을 실제 X11 서버로 릴레이하는 리버스 프록시 역할을합니다. 클라이언트는 단순히 다른 DISPLAY 변수 (또는 -display 인수)를 사용하여 프록시에 연결합니다.
예 :
$ wget http://xorg.freedesktop.org/archive/individual/app/xscope-1.4.1.tar.gz
..
$ tar xzf xscope-1.4.1.tar.gz
..
$ cd xscope-1.4.1
$ ./configure && ./make
..
$ ./xscope & sleep 5; xclock -display :1
...
0.00: Client --> 12 bytes
byte-order: LSB first
major-version: 000b
minor-version: 0000
0.00: 692 bytes <-- X11 Server
protocol-major-version: 000b
protocol-minor-version: 0000
release-number: 00adfef8
resource-id-base: 04c00000
resource-id-mask: 001fffff
motion-buffer-size: 00000100
image-byte-order: LSB first
bitmap-format-bit-order: LSB first
bitmap-format-scanline-unit: 20
bitmap-format-scanline-pad: 20
min-keycode: 8 (^H)
max-keycode: 255 (\377)
vendor: "The X.Org Foundation"
pixmap-formats: (7)
roots: (1)
0.00: Client --> 20 bytes
............REQUEST: QueryExtension
name: "BIG-REQUESTS"
0.00: 32 bytes <-- X11 Server
..............REPLY: QueryExtension
present: True
major-opcode: 85
참고 : 어떤 이유로 X11 클라이언트 설정 (디스플레이)을 변경할 수없는 경우 다른 포트 (일반적으로 6001 대 6000)를 수신하도록 서버를 재구성 한 다음 xscope
원래 포트 (6000)에서 수신 하도록 구성 할 수 있습니다.
xtrace -D:1 -d:0 -k
. (또는 x11trace, 실행 일부 배포판에 이름으로)
X11은 TCP를 전송 프로토콜로 사용합니다. X11의 TCP 포트 범위는 일반적으로 6000-6063이지만 TCP 포트 6000이 사용되는 것을 볼 수 있습니다.
따라서이 포트 범위와 해당 호스트를 필터링하여 선택한 네트워크 모니터를 사용하여 트래픽을 관찰 할 수 있어야합니다. 나는 또한 즉, 알고 wireshark
예를 들어, 이미 필터 사전 설정이 포함되어 x11
관심있는 트래픽을 모니터링 할 수 있습니다.
예를 들어, 로컬 시스템에서 모든 X11 트래픽을 모니터링하려면 (TCP를 사용하는 경우 @ Stéphane Chazelas의 답변 참조) 다음 필터를 사용하십시오.
x11 and ip.src=127.0.0.1 and ip.dst=127.0.0.1
lsof -U | grep '^X'
.