Nếu bạn muốn kết nối X được chuyển tiếp qua SSH, bạn cần kích hoạt nó ở cả phía máy chủ và phía máy khách. (Tùy thuộc vào sự phân bố, nó có thể được kích hoạt hay vô hiệu hóa theo mặc định.) Về phía server, hãy chắc chắn rằng bạn có X11Forwarding yes
trong /etc/sshd_config
(hoặc /etc/ssh/sshd_config
hoặc bất cứ nơi nào các tập tin cấu hình). Về phía khách hàng, chuyển -X
tùy chọn cho ssh
lệnh hoặc đặt ForwardX11
vào của bạn ~/.ssh/config
.
Nếu bạn chạy ssh -X localhost
, bạn sẽ thấy đó $DISPLAY
là (có thể) localhost:10.0
. Tương phản với :0.0
, đó là giá trị khi bạn không được kết nối qua SSH. (Phần .0
này có thể bị bỏ qua; đó là số màn hình, nhưng hiếm khi sử dụng nhiều màn hình.) Có hai dạng màn hình X mà bạn có thể gặp phải:
- Hiển thị cục bộ, không có gì trước
:
.
- TCP hiển thị, với tên máy chủ trước
:
.
Với ssh -X localhost
, bạn có thể truy cập máy chủ X thông qua cả hai màn hình, nhưng các ứng dụng sẽ sử dụng một phương pháp khác: :NUMBER
truy cập máy chủ qua ổ cắm cục bộ và bộ nhớ dùng chung, trong khi HOSTNAME:NUMBER
truy cập máy chủ qua TCP, chậm hơn và vô hiệu hóa một số tiện ích mở rộng.
Lưu ý rằng bạn cần một hình thức ủy quyền để truy cập máy chủ X, được gọi là cookie và thường được lưu trữ phía sau hậu trường trong tệp ~/.Xauthority
. Nếu bạn đang sử dụng ssh để truy cập tài khoản người dùng khác hoặc nếu bản phân phối của bạn đặt cookie vào một tệp khác, bạn có thể thấy rằng DISPLAY=:0
nó không hoạt động trong phiên SSH (nhưng ssh -X
sẽ, nếu nó được bật trong máy chủ; bạn sẽ không bao giờ cần phải lộn xộn XAUTHORITY
khi làm ssh -X
). Nếu đó là một vấn đề, bạn cần đặt XAUTHORITY
biến môi trường hoặc lấy cookie của người dùng khác .
Để trả lời câu hỏi thực tế của bạn:
Màn hình cục bộ tương ứng với một ổ cắm trong /tmp/.X11-unix
.
(cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done)
Màn hình từ xa tương ứng với các cổng TCP mở trên 6000; truy cập số hiển thị N trên máy M được thực hiện bằng cách kết nối với cổng TCP 6000 + N trên máy M. Từ chính máy M:
netstat -lnt | awk '
sub(/.*:/,"",$4) && $4 >= 6000 && $4 < 6100 {
print ($1 == "tcp6" ? "ip6-localhost:" : "localhost:") ($4 - 6000)
}'
(Phần còn lại của gạch đầu dòng này chỉ có lợi cho học tập.)
Từ một máy khác, bạn có thể sử dụng nmap -p 6000-6099 host_name
để thăm dò các cổng TCP mở trong phạm vi thông thường. Ngày nay, hiếm khi có máy chủ X lắng nghe ổ cắm TCP, đặc biệt là bên ngoài giao diện loopback.
Nói đúng ra, một ứng dụng khác có thể đang sử dụng một cổng trong phạm vi thường được sử dụng bởi các máy chủ X. Bạn có thể biết liệu máy chủ X có lắng nghe hay không bằng cách kiểm tra chương trình nào có cổng mở.
lsof -i -n | awk '$9 ~ /:60[0-9][0-9]$/ {print}'
Nếu điều đó cho thấy một cái gì đó mơ hồ như thế sshd
, thì không có cách nào để biết chắc chắn đó là máy chủ X hay sự trùng hợp.
( DISPLAY=:0 yourapp & )
.