Jawaban:
Anda dapat berbicara X11 melalui TCP, atau melalui soket domain Unix atau (di Linux) pada soket domain Unix di namespace abstrak .
Ketika DISPLAY diatur ke host:4, singkatan dari tcp/host:4, klien menggunakan TCP untuk terhubung ke server. Port TCP kemudian 6000 ditambah nomor layar (dalam hal ini 6004).
Dalam hal itu, Anda dapat menangkap lalu lintas dengan sniffer jaringan seperti tcpdumpatau wiresharkdengan menangkap lalu lintas TCP pada port itu.
Ketika $DISPLAYhanya :4(kependekan dari unix/:4), maka klien menggunakan soket domain unix. Entah /tmp/.X11-unix/X4atau jalur yang sama di namespace ABSTRAK (biasanya ditampilkan sebagai @/tmp/.X11-unix/X4dalam netstatoutput).
Menangkap lalu lintas lebih rumit.
Jika server X Anda mendengarkan pada TCP (tapi mereka tidak cenderung lagi saat ini), yang paling mudah adalah dengan mengubah DISPLAYke localhost:4bukannya :4dan menangkap lalu lintas jaringan pada port 6004 pada interface loopback.
Jika tidak, Anda dapat menggunakan socatsebagai pria di tengah yang menerima koneksi sebagai TCP dan meneruskannya sebagai unix atau abstrak :
socat tcp-listen:6004,reuseaddr,fork unix:/tmp/.X11-unix/X4
Anda kemudian dapat mengatur $DISPLAYke localhost:4dan menangkap lalu lintas jaringan seperti di atas atau meminta socatuntuk membuangnya -x -v.
Sekarang, jika Anda tidak dapat mengubah $DISPLAYdan ingin menangkap lalu lintas aplikasi X lokal yang sudah berjalan yang menggunakan soket domain unix, di situlah ia menjadi rumit.
Salah satu pendekatan bisa dengan menggunakan strace(atau perintah setara pada sistem Anda jika bukan Linux) untuk melacak panggilan sistem kirim / terima yang aplikasi Anda lakukan untuk berkomunikasi dengan server X.
Di sini untuk xterm, saya amati itu writev(), recvfrom()dan recvmsg()panggilan sistem pada file deskriptor 3 untuk itu. Jadi saya bisa melakukan:
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 -
(atau tshark -Vi -).
Idenya adalah untuk mengekstrak timestamp dan byte yang dikirim / diterima dari output stracedan digunakan text2pcapuntuk mengubahnya menjadi pcap(menambahkan header TCP dummy pada port 6000 dengan -T6000,1234) sebelum diumpankan wireshark. Kami juga membagi paket untuk menghindari batas 64kiB pada panjang maksimum catatan pcap.
Perhatikan bahwa untuk text2pcapdapat bekerja dengan benar sehubungan dengan mendapatkan arah lalu lintas yang benar, Anda memerlukan versi wireshark yang relatif baru.
Jika Anda terutama tertarik pada protokol X11 dan bukan TCP / IP dan hal-hal ethernet yang mendasarinya, dan jika Anda dapat menyesuaikan pengaturan klien atau server, Anda mungkin menggunakan alat yang dirancang khusus untuk menangkap dan mendekode lalu lintas antara X11 klien dan server X11. Tidak seperti wiresharkpembangkang X11, alat-alat ini tidak mungkin dibingungkan oleh lalu lintas, karena terlibat sepenuhnya dengannya.
Yang utama adalah xscope yang, meskipun tidak tersedia sebagai biner untuk beberapa distribusi Unix atau Linux, dapat dengan mudah dibangun dari sumber .
Atau, ada juga xtruss dan xtrace tapi saya tidak punya pengalaman dengan mereka.
Semua alat ini bertindak seperti reverse-proxy yang menyampaikan koneksi ke server X11 nyata. Klien cukup menggunakan variabel DISPLAY yang berbeda (atau argumen tampilan) untuk terhubung ke proxy.
misalnya:
$ 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
Catatan: Jika karena alasan tertentu Anda tidak dapat mengubah pengaturan klien X11 (tampilan), Anda mungkin dapat mengkonfigurasi ulang server untuk mendengarkan port yang berbeda (biasanya 6001 vs 6000) dan kemudian mengkonfigurasi xscopeuntuk mendengarkan pada port asli (6000).
xtrace -D:1 -d:0 -k. (Atau x11trace, karena executable dinamai pada beberapa distro)
X11 menggunakan TCP sebagai protokol transportnya. Rentang port TCP untuk X11 biasanya 6000-6063 tetapi kemungkinan besar Anda akan melihat port TCP 6000 digunakan.
Jadi, Anda harus dapat menggunakan monitor jaringan apa pun yang Anda pilih untuk mengamati lalu lintas dengan memfilter rentang port ini dan host yang dimaksud. Saya juga tahu, bahwa wireshark, misalnya, sudah berisi preset filter x11untuk memantau lalu lintas yang Anda minati.
Misalnya, untuk memantau semua lalu lintas X11 pada mesin lokal (jika menggunakan TCP; lihat jawaban @ Stéphane Chazelas) gunakan filter berikut:
x11 and ip.src=127.0.0.1 and ip.dst=127.0.0.1
lsof -U | grep '^X',.