หากคุณต้องการให้การเชื่อมต่อ 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 & )
วิธีทำความสะอาดเพื่อเปิดใช้งานจากขั้วคือ