Antworten:
Sie können X11 über TCP oder über einen Unix-Domain-Socket oder (unter Linux) über einen Unix-Domain-Socket im abstrakten Namespace kommunizieren.
Wenn DISPLAY auf host:4
(kurz für) eingestellt ist tcp/host:4
, verwenden Clients TCP, um eine Verbindung zum Server herzustellen . Der TCP-Port ist dann 6000 plus der Anzeigenummer (in diesem Fall 6004).
In diesem Fall können Sie den Datenverkehr mit einem beliebigen Netzwerk-Sniffer tcpdump
oder wireshark
durch Erfassen des TCP-Datenverkehrs an diesem Port erfassen.
Wenn $DISPLAY
nur :4
(kurz für unix/:4
), dann verwenden Clients einen Unix-Domain-Socket. Entweder /tmp/.X11-unix/X4
oder derselbe Pfad im ABSTRACT- Namespace (normalerweise wie @/tmp/.X11-unix/X4
in der netstat
Ausgabe dargestellt).
Die Erfassung des Datenverkehrs ist dann schwieriger.
Wenn Ihr X - Server lauscht auf TCP (aber sie sind in der Regel nicht mehr heutzutage), ist am einfachsten zu ändern , DISPLAY
um localhost:4
statt :4
den Netzwerkverkehr auf Port 6004 auf der Loopback - Schnittstelle und zu erfassen.
Wenn dies nicht der Fall ist, können Sie socat
als Mann in der Mitte arbeiten , der Verbindungen als TCP akzeptiert und diese als Unix oder Abstract weiterleitet :
socat tcp-listen:6004,reuseaddr,fork unix:/tmp/.X11-unix/X4
Sie können dann festlegen , $DISPLAY
um localhost:4
den Netzwerkverkehr wie oben oder sagen und erfassen socat
sie Dump mit -x -v
.
Wenn Sie $DISPLAY
den Datenverkehr einer bereits laufenden lokalen X-Anwendung, die Unix-Domain-Sockets verwendet, nicht ändern und erfassen können, wird dies schwierig.
Ein Ansatz könnte darin bestehen, strace
die Sende- / Empfangs-Systemaufrufe, die Ihre Anwendung für die Kommunikation mit dem X-Server durchführt, zu verfolgen (oder den entsprechenden Befehl auf Ihrem System, wenn nicht Linux).
Hier für xterm
beobachte ich es tut writev()
, recvfrom()
und recvmsg()
Systemaufrufe auf Dateideskriptor 3 dafür. Also kann ich tun:
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 -
(oder tshark -Vi -
).
Die Idee ist , den Zeitstempel zu extrahieren und Bytes von der Ausgabe der gesendet / empfangen strace
und die Verwendung text2pcap
zu konvertieren , die in eine pcap
(Hinzufügen von Dummy - TCP - Header an Port 6000 mit -T6000,1234
) vor der Fütterung an wireshark
. Wir teilen auch Pakete auf, um die 64-KB-Grenze für die maximale Länge eines pcap-Datensatzes zu vermeiden.
Beachten Sie, dass text2pcap
Sie eine relativ aktuelle Version von wireshark benötigen, um die richtige Verkehrsrichtung zu erreichen.
Wenn Sie sich hauptsächlich für das X11-Protokoll und nicht für die zugrunde liegenden TCP / IP- und Ethernet-Komponenten interessieren und die Client- oder Servereinstellungen anpassen können, können Sie ein spezielles Tool zum Erfassen und Dekodieren des Datenverkehrs zwischen einem X11 verwenden Client und ein X11-Server. Im Gegensatz zum wireshark
X11-Dissektor ist es unwahrscheinlich, dass diese Tools durch den Datenverkehr verwechselt werden, da sie vollständig in den Datenverkehr eingebunden sind.
Das wichtigste ist xscope, das, obwohl es für einige Unix- oder Linux-Distributionen nicht als Binärdatei verfügbar ist, problemlos aus dem Quellcode erstellt werden kann .
Alternativ gibt es auch xtruss und xtrace aber ich habe keine erfahrung damit.
Alle diese Tools fungieren als Reverse-Proxies, die Verbindungen zu einem echten X11-Server weiterleiten. Die Clients verwenden einfach eine andere DISPLAY-Variable (oder ein anderes -display-Argument), um eine Verbindung zum Proxy herzustellen.
z.B:
$ 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
Hinweis: Wenn Sie aus irgendeinem Grund die Einstellungen der X11-Clients (Anzeige) nicht ändern können, können Sie den Server möglicherweise neu konfigurieren, um einen anderen Port (normalerweise 6001 vs 6000) abzuhören, und dann konfigurieren xscope
den ursprünglichen Port (6000) überwacht.
xtrace -D:1 -d:0 -k
. (Oder x11trace, da die ausführbare Datei in einigen Distributionen benannt ist)
X11 verwendet TCP als Transportprotokoll. Der TCP-Portbereich für X11 liegt normalerweise zwischen 6000 und 6063, höchstwahrscheinlich wird jedoch der TCP-Port 6000 verwendet.
Sie sollten daher in der Lage sein, mithilfe eines beliebigen Netzwerkmonitors den Datenverkehr zu überwachen, indem Sie nach diesem Portbereich und den betreffenden Hosts filtern. Ich weiß auch, dass wireshark
zum Beispiel bereits ein Filter-Preset x11
zur Überwachung des von Ihnen gewünschten Verkehrs enthalten ist.
Verwenden Sie zum Überwachen des gesamten X11-Datenverkehrs auf dem lokalen Computer (wenn Sie TCP verwenden, lesen Sie die Antwort von @ Stéphane Chazelas) den folgenden Filter:
x11 and ip.src=127.0.0.1 and ip.dst=127.0.0.1
lsof -U | grep '^X'
.