Você pode falar sobre o TCP X11, ou sobre um soquete de domínio Unix ou (no Linux) em um soquete de domínio Unix no namespace abstract .
Quando DISPLAY é definido como host:4 , abreviação de tcp/host:4 , os clientes usam o TCP para se conectar ao servidor. A porta TCP é então 6000 mais o número de exibição (nesse caso 6004).
Nesse caso, você pode capturar o tráfego com qualquer sniffer de rede como tcpdump ou wireshark , capturando o tráfego TCP nessa porta.
Quando $DISPLAY é apenas :4 (abreviação de unix/:4 ), os clientes usam um soquete de domínio unix. /tmp/.X11-unix/X4 ou o mesmo caminho no namespace ABSTRACT (normalmente mostrado como @/tmp/.X11-unix/X4 in netstat output).
Capturar o tráfego é mais complicado.
Se o seu servidor X escuta no TCP (mas eles tendem a não mais mais atualmente), o mais fácil é alterar DISPLAY para localhost:4 em vez de :4 e capturar o tráfego de rede na porta 6004 na interface de loopback.
Se não, você pode usar socat como um homem no meio que aceita conexões como TCP e as encaminha como unix ou :
socat tcp-listen:6004,reuseaddr,fork unix:/tmp/.X11-unix/X4
Você pode então definir $DISPLAY para localhost:4 e capturar o tráfego de rede como acima ou informar socat para despejá-lo com -x -v .
Agora, se você não puder alterar $DISPLAY e quiser capturar o tráfego de um aplicativo X local em execução que use soquetes de domínio unix, é aí que fica complicado.
Uma abordagem poderia ser usar strace (ou o comando equivalente em seu sistema, se não Linux) para rastrear as chamadas do sistema de envio / recebimento que seu aplicativo faz para se comunicar com o servidor X.
Aqui para xterm , observo que writev() , recvfrom() e recvmsg() chama o sistema no descritor de arquivo 3 para isso. Então eu posso fazer:
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 -
(ou tshark -Vi - ).
A ideia é extrair o registro de data e hora e bytes enviados / recebidos da saída de strace e usar text2pcap para converter isso em pcap (adicionando cabeçalhos TCP simulados na porta 6000 com -T6000,1234 ) antes de alimentar codificar%. Também dividimos pacotes para evitar o limite de 64 kB no comprimento máximo de um registro pcap.
Observe que, para que wireshark funcione corretamente no que diz respeito a acertar a direção do tráfego, você precisa de uma versão relativamente recente do wireshark.