Відповіді:
Ви можете розмовляти з X11 через TCP або над гніздом домену Unix або (в Linux) в розетці домену Unix в абстрактному просторі імен.
Якщо для параметра DISPLAY встановлено host:4короткий термін tcp/host:4, клієнти використовують TCP для підключення до сервера. Порт TCP тоді становить 6000 плюс номер дисплея (у цьому випадку 6004).
У цьому випадку ви можете зафіксувати трафік будь-яким мережевим sniffer, схожим tcpdumpабо wiresharkзахопивши трафік TCP на цьому порту.
Коли $DISPLAYце лише :4(скорочено для unix/:4), клієнти використовують розетку домену unix. Будь-який /tmp/.X11-unix/X4або той самий шлях у просторі імен РЕФЕРАТ (зазвичай показано як @/tmp/.X11-unix/X4у netstatвихідному).
Захоплення трафіку тоді складніше.
Якщо ваш X-сервер слухає TCP (але в даний час вони, як правило, більше не працюють), найпростіше - перейти DISPLAYна localhost:4замість :4і захопити мережевий трафік на порту 6004 в інтерфейсі петлі.
Якщо це не так, ви можете використовувати socatяк людину посередині, яка приймає з'єднання як TCP та пересилає їх як unix або абстракт :
socat tcp-listen:6004,reuseaddr,fork unix:/tmp/.X11-unix/X4
Після цього ви можете встановити , $DISPLAYщоб localhost:4і захопити мережевий трафік , як зазначено вище , або сказати , socatщоб скинути його з -x -v.
Тепер, якщо ви не можете змінити $DISPLAYі хочете зафіксувати трафік вже запущеного локального додатка X, який використовує сокети домену Unix, тут це стає складним.
Одним із підходів може бути використання strace(або еквівалентна команда у вашій системі, якщо не Linux) для відстеження системних викликів надсилання / отримання, які ваша програма робить для зв'язку з сервером X.
Ось 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 -).
Ідея полягає у витягуванні часової позначки та байтів, надісланих / отриманих з виводу straceта використання text2pcapдля їх перетворення в pcap(додавання фіктивних заголовків TCP на порт 6000 з -T6000,1234) перед подачею в wireshark. Ми також розділяємо пакети, щоб уникнути обмеження в 64кіБ на максимальну довжину запису в pcap.
Зауважте, що для text2pcapправильної роботи щодо правильного напрямку руху вам потрібна відносно недавня версія проводки.
Якщо вас цікавлять в основному протокол X11, а не базові речі TCP / IP та Ethernet, і якщо ви в змозі відрегулювати налаштування клієнта чи сервера, ви можете скористатися інструментом, спеціально розробленим для збору та декодування трафіку між X11 клієнт та сервер X11. На відміну від wiresharkдисектора X11, ці інструменти навряд чи можуть заплутати трафік, будучи повністю задіяними в ньому.
Основним з них є xscope, який, незважаючи на те, що він не доступний як двійковий файл для деяких дистрибутивів Unix або Linux, може бути легко побудований з джерела .
Крім того, є також xtruss і xtrace, але я не маю досвіду з ними.
Усі ці інструменти діють як зворотні проксі-сервери, що передають з'єднання з реальним сервером X11. Клієнти просто використовують іншу змінну 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 як свій транспортний протокол. Діапазон портів TCP для X11 зазвичай становить 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'.