Câu trả lời:
Bạn có thể nói chuyện X11 qua TCP hoặc qua ổ cắm tên miền Unix hoặc (trên Linux) trên ổ cắm tên miền Unix trong không gian tên trừu tượng .
Khi HIỂN THỊ được đặt thành host:4
, viết tắt tcp/host:4
, khách hàng sử dụng TCP để kết nối với máy chủ. Cổng TCP sau đó là 6000 cộng với số hiển thị (trong trường hợp đó là 6004).
Trong trường hợp đó, bạn có thể chụp lưu lượng với bất kỳ trình thám thính mạng nào tcpdump
hoặc wireshark
bằng cách bắt lưu lượng TCP trên cổng đó.
Khi $DISPLAY
chỉ :4
(viết tắt unix/:4
), sau đó khách hàng sử dụng ổ cắm miền unix. Hoặc /tmp/.X11-unix/X4
hoặc cùng một đường dẫn trong không gian tên ABSTRACT (thường được hiển thị như @/tmp/.X11-unix/X4
trong netstat
đầu ra).
Nắm bắt giao thông sau đó là khó khăn hơn.
Nếu máy chủ X của bạn nghe trên TCP (nhưng hiện tại chúng có xu hướng không còn nữa), cách dễ nhất là thay đổi DISPLAY
và localhost:4
thay vào đó là :4
lưu lượng truy cập mạng trên cổng 6004 trên giao diện loopback.
Nếu không, bạn có thể sử dụng socat
như một người đàn ông ở giữa chấp nhận các kết nối dưới dạng TCP và chuyển tiếp chúng dưới dạng unix hoặc trừu tượng :
socat tcp-listen:6004,reuseaddr,fork unix:/tmp/.X11-unix/X4
Sau đó bạn có thể thiết lập $DISPLAY
để localhost:4
và nắm bắt được lưu lượng mạng như trên hoặc nói socat
để đổ nó với -x -v
.
Bây giờ, nếu bạn không thể thay đổi $DISPLAY
và muốn nắm bắt lưu lượng truy cập của một ứng dụng X cục bộ đang chạy sử dụng các ổ cắm tên miền unix, thì đó là điều khó khăn.
Một cách tiếp cận có thể là sử dụng strace
(hoặc lệnh tương đương trên hệ thống của bạn nếu không phải Linux) để theo dõi các cuộc gọi hệ thống gửi / nhận mà ứng dụng của bạn thực hiện để liên lạc với máy chủ X.
Ở đây xterm
, tôi quan sát nó writev()
, recvfrom()
và recvmsg()
hệ thống gọi mô tả tập tin 3 cho điều đó. Vì vậy, tôi có thể làm:
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 -
(hoặc tshark -Vi -
).
Ý tưởng là trích xuất dấu thời gian và byte được gửi / nhận từ đầu ra strace
và sử dụng text2pcap
để chuyển đổi nó thành một pcap
(thêm các tiêu đề TCP giả trên cổng 6000 với -T6000,1234
) trước khi nạp vào wireshark
. Chúng tôi cũng phân chia các gói để tránh giới hạn 64kiB về độ dài tối đa của bản ghi pcap.
Lưu ý rằng text2pcap
để hoạt động chính xác liên quan đến việc điều chỉnh hướng giao thông, bạn cần có một phiên bản tương đối gần đây.
Nếu bạn chủ yếu quan tâm đến giao thức X11 chứ không phải các công cụ TCP / IP và ethernet cơ bản và nếu bạn có thể điều chỉnh cài đặt máy khách hoặc máy chủ, bạn có thể sử dụng một công cụ được thiết kế đặc biệt để chụp và giải mã lưu lượng giữa X11 máy khách và máy chủ X11. Không giống như wireshark
người mổ xẻ X11, các công cụ này khó có thể bị nhầm lẫn bởi lưu lượng truy cập, được tham gia đầy đủ với nó.
Cái chính là xscope , mặc dù không có sẵn dưới dạng nhị phân cho một số bản phân phối Unix hoặc Linux, có thể dễ dàng được xây dựng từ nguồn .
Ngoài ra, cũng có xtruss và xtrace nhưng tôi không có kinh nghiệm với chúng.
Tất cả các công cụ này hoạt động giống như các proxy chuyển tiếp kết nối đến một máy chủ X11 thực sự. Các máy khách chỉ cần sử dụng một biến HIỂN THỊ khác (hoặc đối số hiển thị) để kết nối với proxy.
ví dụ:
$ 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
Lưu ý: Nếu vì lý do nào đó bạn không thể thay đổi cài đặt máy khách X11 (hiển thị), bạn có thể cấu hình lại máy chủ để nghe một cổng khác (thường là 6001 so với 6000) và sau đó định cấu hình xscope
để nghe trên cổng ban đầu (6000).
xtrace -D:1 -d:0 -k
. (Hoặc x11trace, vì tệp thực thi được đặt tên trên một số bản phát hành)
X11 sử dụng TCP làm giao thức vận chuyển. Phạm vi cổng TCP cho X11 thường là 6000-6063 nhưng rất có thể bạn sẽ thấy cổng TCP 6000 đang được sử dụng.
Vì vậy, bạn sẽ có thể sử dụng bất kỳ màn hình mạng nào bạn chọn để quan sát lưu lượng bằng cách lọc cho phạm vi cổng này và các máy chủ được đề cập. Tôi cũng biết, wireshark
chẳng hạn, đã có sẵn bộ lọc x11
để theo dõi lưu lượng truy cập mà bạn quan tâm.
Ví dụ: để giám sát tất cả lưu lượng X11 trên máy cục bộ (nếu sử dụng TCP; hãy tham khảo câu trả lời của @ Stéphane Chazelas) sử dụng bộ lọc sau:
x11 and ip.src=127.0.0.1 and ip.dst=127.0.0.1
lsof -U | grep '^X'
.