หากคุณต้องการให้การเชื่อมต่อ X ถูกส่งต่อผ่าน SSH คุณจะต้องเปิดใช้งานทั้งในฝั่งเซิร์ฟเวอร์และฝั่งไคลเอ็นต์ (ขึ้นอยู่กับการกระจายก็อาจจะเปิดใช้งานหรือยกเลิกโดยปริยาย.) ในฝั่งเซิร์ฟเวอร์ตรวจสอบให้แน่ใจว่าคุณมีX11Forwarding yesใน/etc/sshd_config(หรือ/etc/ssh/sshd_configหรือที่ใดก็ตามแฟ้มการกำหนดค่าเป็น) ในด้านลูกค้าผ่าน-Xตัวเลือกให้กับsshคำสั่งหรือวางในของคุณForwardX11~/.ssh/config
หากคุณทำงานssh -X localhostคุณจะเห็นว่า$DISPLAYเป็น localhost:10.0(อาจ) ตรงกันข้ามกับ:0.0ซึ่งเป็นค่าเมื่อคุณไม่ได้เชื่อมต่อผ่าน SSH ( .0อาจตัดส่วนนี้ออกไปเป็นหมายเลขหน้าจอ แต่มีหลายหน้าจอที่ไม่ค่อยได้ใช้) มีหน้าจอ X สองรูปแบบที่คุณน่าจะเคยพบ:
:แสดงท้องถิ่นมีอะไรก่อน
- TCP
:แสดงที่มีชื่อโฮสต์ก่อน
ด้วยssh -X localhostคุณสามารถเข้าถึงเซิร์ฟเวอร์ X ผ่านจอแสดงผลทั้งสอง แต่แอปพลิเคชันจะใช้วิธีการอื่น: :NUMBERเข้าถึงเซิร์ฟเวอร์ผ่านซ็อกเก็ตท้องถิ่นและหน่วยความจำที่แชร์ในขณะที่HOSTNAME:NUMBERเข้าถึงเซิร์ฟเวอร์ผ่าน TCP ซึ่งช้าลงและปิดการใช้งานส่วนขยายบางอย่าง
~/.Xauthorityโปรดทราบว่าคุณต้องการรูปแบบของการให้สิทธิ์ในการเข้าถึงเซิร์ฟเวอร์เอ็กซ์เรียกคุกกี้และเก็บไว้ตามปกติอยู่เบื้องหลังในไฟล์ หากคุณใช้ ssh เพื่อเข้าถึงบัญชีผู้ใช้อื่นหรือถ้าการแจกจ่ายของคุณทำให้คุกกี้อยู่ในไฟล์อื่นคุณอาจพบว่าDISPLAY=:0มันไม่ทำงานภายในเซสชัน SSH (แต่ssh -Xจะถ้าเปิดใช้งานในเซิร์ฟเวอร์คุณจะไม่เคย ต้องยุ่งXAUTHORITYเมื่อทำssh -X) หากเป็นปัญหาที่คุณจำเป็นต้องตั้งค่าXAUTHORITYตัวแปรสภาพแวดล้อมหรือได้รับคุกกี้ของผู้อื่น
ในการตอบคำถามจริงของคุณ:
/tmp/.X11-unixแสดงท้องถิ่นตรงกับซ็อกเก็ตใน
(cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done)
การแสดงระยะไกลสอดคล้องกับพอร์ต TCP ที่เปิดด้านบน 6000; การเข้าถึงหมายเลขที่แสดงบนเครื่อง M ทำได้โดยเชื่อมต่อกับพอร์ต TCP 6000 + N บนเครื่อง M จากเครื่อง M:
netstat -lnt | awk '
sub(/.*:/,"",$4) && $4 >= 6000 && $4 < 6100 {
print ($1 == "tcp6" ? "ip6-localhost:" : "localhost:") ($4 - 6000)
}'
(ส่วนที่เหลือของสัญลักษณ์นี้มีความสนใจด้านวิชาการเท่านั้น)
จากเครื่องอื่นคุณสามารถใช้nmap -p 6000-6099 host_nameในการสอบสวนพอร์ต TCP ที่เปิดอยู่ในช่วงปกติ ทุกวันนี้มีน้อยมากที่มีเซิร์ฟเวอร์ X ที่ฟังบนซ็อกเก็ต TCP โดยเฉพาะนอกอินเตอร์เฟสลูปแบ็ค
พูดอย่างเคร่งครัดแอพพลิเคชันอื่นอาจใช้พอร์ตในช่วงที่เซิร์ฟเวอร์ X ใช้งาน คุณสามารถบอกได้ว่าเซิร์ฟเวอร์ X กำลังฟังอยู่หรือไม่โดยตรวจสอบว่าโปรแกรมใดเปิดพอร์ตอยู่
lsof -i -n | awk '$9 ~ /:60[0-9][0-9]$/ {print}'
หากนั่นแสดงให้เห็นสิ่งที่ไม่ชัดเจนเช่นsshdไม่มีวิธีที่จะรู้ว่ามันเป็นเซิร์ฟเวอร์ X หรือเรื่องบังเอิญ
( DISPLAY=:0 yourapp & )วิธีทำความสะอาดเพื่อเปิดใช้งานจากขั้วคือ