นี่คือคำตอบที่เติมเต็มด้วยข้อมูลเฉพาะจากระบบย่อย Windows สำหรับ Linux คำตอบที่ได้รับการยอมรับเป็นที่ถูกต้อง: คุณDISPLAY
ตัวแปรมีการกำหนดค่าไม่ถูกต้อง ยังไม่ชัดเจนว่าทำไมเป็นกรณีของคำตอบนั้นโดยลำพังดังนั้นฉันจึงแก้ไขคำตอบนี้
หากคุณใช้งาน cygwin หรือ Windows-Subsystem สำหรับ Linux และเซิร์ฟเวอร์ X11 ของคุณเป็นแบบ windows (เช่นVcXsrv
หรือXMing
) เป็นไปได้มากว่าเซิร์ฟเวอร์ X11 ของคุณกำลังรับฟังพอร์ต TCP (เช่น127.0.0.1
บนพอร์ต TCP 6000-6010
) มากกว่าบน ซ็อกเก็ตโดเมน Unix เริ่มต้น ( /tmp/.X11-unix/X0
) ซ็อกเก็ต Unix ไม่รองรับ Windows ในเวลานี้แม้ใน WSL การสื่อสารระหว่างโปรแกรมในสภาพแวดล้อมที่เหมือน Linux และโปรแกรมที่ทำงานโดยตรงบนโฮสต์ windows นั้นโดยทั่วไปจะง่ายกว่าซ็อกเก็ต IP
เมื่อคุณเรียกใช้โปรแกรมกราฟิกในประเทศ (เช่นจาก Cygwin หรือสภาพแวดล้อม WSL ของโฮสต์ของคุณ) และคุณDISPLAY
ตัวแปรมีการตั้งค่าเริ่มต้น (คือDISPLAY=:0.0
) การใช้งานครั้งแรกจะพยายามที่จะเชื่อมต่อกับเซิร์ฟเวอร์ X /tmp/.X11-unix/X0
ผ่านซ็อกเก็ตยูนิกซ์ สิ่งนี้จะล้มเหลว แต่แอปพลิเคชันส่วนใหญ่จะกลับไปใช้การเชื่อมต่อ TCP localhost
ซึ่งควรประสบความสำเร็จในการเข้าถึงเซิร์ฟเวอร์โดยสมมติว่าเซิร์ฟเวอร์ X ของคุณได้รับการกำหนดค่าด้วยค่าเริ่มต้น
คุณสามารถยืนยันได้ว่าสิ่งนี้เกิดขึ้นโดยการค้นหาการconnect()
โทรในบันทึก strace จากการรันแอปพลิเคชันกราฟิกของคุณ โดยทั่วไปจะเกิดขึ้นก่อนที่จะมีหน้าต่างหลักของแอปพลิเคชันปรากฏขึ้น
พฤติกรรมทางเลือกนั้นไม่ได้เกิดขึ้นเมื่อ ssh กำลังเปลี่ยนเส้นทางการเชื่อมต่อจากด้านระยะไกลดังนั้นคุณจึงได้รับข้อผิดพลาดนั้น sshd
แท้จริงแล้วคือการส่งต่อการเชื่อมต่อไปยังด้านโลคัล แต่การเชื่อมต่อโลคัลของไคลเอ็นต์ ssh จะสิ้นสุดลงเนื่องจากไม่สามารถติดต่อกับเซิร์ฟเวอร์ผ่านช่องเสียบ Unix ได้ คุณได้รับENOENT
ข้อผิดพลาดแล้ว
ในกรณีเช่นนี้การเปลี่ยนDISPLAY
ตัวแปรของคุณเพื่อใช้ไวยากรณ์ TCP แทน:0.0
ไวยากรณ์สามารถแก้ไขปัญหา:
DISPLAY=127.0.0.1:0 ssh remote some-gui-application
เช่นเดียวกับคำตอบอื่น ๆ ที่กล่าวถึงคุณยังสามารถส่งออกตัวแปรแบบโต้ตอบได้จาก shell prompt ของคุณ:
$ export DISPLAY=127.0.0.1:0
...
$ ssh remote some-gui-application
คุณสามารถจัดเก็บการตั้งค่านี้ได้อย่างถาวรยิ่งขึ้นด้วยการเพิ่มบรรทัดนั้นลงในสคริปต์การเริ่มต้นโปรไฟล์ของล็อกอินเชลล์ (เช่น~/.bash_profile
)
หมายเหตุ:เชลล์บางตัวมีสคริปต์การเริ่มต้นที่แตกต่างกันสำหรับการเข้าสู่ระบบและการไม่เข้าสู่ระบบ ยกตัวอย่างเช่นกับทุบตีคุณสามารถเขียนเส้นที่สคริปต์ที่ไม่เข้าสู่ระบบเช่นแทนที่จะ~/.bashrc
~/.bash_profile
หากคุณเป็นเช่นนั้นโปรดระวังอย่าแทนที่ค่าที่กำหนดเองใด ๆ ที่อาจถูกกำหนดโดย ssh นั่นเป็นกรณีถ้าคุณกระโดดเข้าไปในโฮสต์ของคุณเป็นครั้งแรกผ่านทาง ssh แล้วกระโดดอีกครั้งไปยังโฮสต์อื่น (ดังนั้นจึงซ้อนการส่งต่อ X11 ของคุณ)
strace -fo /tmp/trace ssh....
เพื่อตรวจสอบว่าจะพยายามเชื่อมต่อซ็อกเก็ตโดเมน Unix นั้น