ทำไมความพยายามในการส่งต่อ X11 ของฉันจึงล้มเหลวด้วย“ connect /tmp/.X11-unix/X0: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว”


33

ในเครื่องท้องถิ่นของฉันฉันเรียกใช้:

ssh -X me@remotemachine.com

(เพื่อความสมบูรณ์ฉันได้ทดสอบสิ่งต่อไปนี้ทั้งหมดโดยใช้ -Y ด้วยผลลัพธ์ที่เหมือนกัน)

ตามที่คาดไว้การเข้าถึงแบบ remotemachine.com นี้ใช้ได้ดีและทุกอย่างดูดี หากฉันพยายามเรียกใช้ xcalc ฉันจะได้รับ:

 connect /tmp/.X11-unix/X0: No such file or directory
 Error: Can't open display: localhost:10.0

แต่,

$ ls -la /tmp/.X11-unix/
total 36
drwxrwxrwt 2 root root  4096 2012-11-23 09:29 .
drwxrwxrwt 8 root root 32768 2012-11-29 08:22 ..
srwxrwxrwx 1 root root     0 2012-11-23 09:29 X0

ดังนั้นไม่เพียง แต่ /tmp/.X11-unix/X0 ยังมีอยู่ แต่ก็มีสิทธิ์ใช้งาน r / w / x สากล!

ก่อนหน้านี้ฉันเคยใช้การส่งต่อแบบ x โดยไม่มีปัญหาถึงแม้จะไม่ใช่ในบางครั้ง ...

uname -a บนเซิร์ฟเวอร์สำหรับการอ้างอิง:

Linux machinename 2.6.32-25-generic #45-Ubuntu SMP Sat Oct 16 19:52:42 UTC 2010 x86_64 GNU/Linux

รับการค้นหาในเว็บเป็นเวลาสองสามชั่วโมงตอนนี้ไม่ประสบความสำเร็จ อื่น ๆ ที่กล่าวถึงปัญหาเดียวกัน แต่ไม่มีวิธีแก้ไข


โปรดทราบว่ามันเป็นไฟล์ในเครื่องท้องถิ่นที่คุณต้องตรวจสอบที่นี่ไม่ใช่ไฟล์ระยะไกล ฉันจะใช้strace -fo /tmp/trace ssh....เพื่อตรวจสอบว่าจะพยายามเชื่อมต่อซ็อกเก็ตโดเมน Unix นั้น
Stéphane Chazelas

Ah! นั่นอาจเป็นได้ เครื่องของฉันไม่มีไดเรกทอรี /tmp/.X11-unix/
John Doucette

คำตอบ:


24

หากคุณมีเซิร์ฟเวอร์ X ที่ทำงานอยู่และDISPLAYตัวแปรสภาพแวดล้อมถูกตั้งค่าเป็น:0บอกให้แอปพลิเคชันเชื่อมต่อกับเซิร์ฟเวอร์ X โดยใช้ซ็อกเก็ตโดเมน unix ซึ่งโดยทั่วไปจะพบได้บน Linux ใน/tmp/.X11-unix/X0(ดูด้านล่างเกี่ยวกับนามธรรม namespaceบน Linux ล่าสุด) .

เมื่อคุณ ssh ไปยังเครื่องremotemachine , sshdบนremotemachineชุด DISPLAY ไปlocalhost:10(เช่น) ซึ่งเวลานี้หมายความว่าการเชื่อมต่อ X จะไม่ต้องทำผ่าน TCP กับพอร์ต 6010 ของ localhost เครื่อง sshd on remotemachine รอฟังการเชื่อมต่อที่นั่นและส่งต่อการเชื่อมต่อขาเข้าใด ๆ ไปยังไคลเอ็นต์ ssh จากนั้นไคลเอ็นต์ ssh จะพยายามเชื่อมต่อกับ/tmp/.X11-unix/X0(ที่ปลายด้านบนไม่ใช่รีโมต) เพื่อติดต่อเซิร์ฟเวอร์ X ของคุณ

ตอนนี้บางทีคุณอาจไม่มีเซิร์ฟเวอร์ X ที่ทำงานอยู่ (คุณใช้ Mac หรือไม่) หรืออาจจะไม่พบซ็อกเก็ตโดเมน unix ใน /tmp/.X11-unix ซึ่งหมายความว่า ssh ไม่ได้รับการกำหนดค่าอย่างถูกต้องที่คอมไพล์ เวลา.

เพื่อหาเส้นทางที่เหมาะสมสำหรับซ็อกเก็ตยูนิกซ์คุณสามารถลองstrace -e connect xlogo(หรือเทียบเท่ากับระบบของคุณ) บนเครื่องของคุณเพื่อดูว่าแอปพลิเคชัน X ปกติทำอะไร

netstat -x | grep X อาจให้เบาะแส

สำหรับบันทึกบนเครื่อง wheezy Linux Debian ที่นี่ Xorg ฟังทั้ง/tmp/.X11-unix/X0ในระบบไฟล์และ/tmp/.X11-unix/X0ในnamespace ที่เป็นนามธรรม (เขียนโดยทั่วไป@/tmp/.X11-unix/X0) จากstraceการใช้งาน X11 ดูเหมือนว่าตอนนี้ใช้ namespace นามธรรมโดยค่าเริ่มต้นซึ่งอธิบายว่าทำไมคนเหล่านั้นยังคงทำงานถ้า/tmp/.X11-unixจะถูกลบออกในขณะที่sshไม่ได้ใช้ที่ namespace นามธรรม


1
หรือตรวจสอบlsof -p <PID of your local X server>ที่คุณควรจะสามารถค้นหา/some/thing/Xnไฟล์หมายเลขnของคุณ DISPLAY
เตอร์

ขอบคุณมันมีประโยชน์มาก ยังไงก็ตามไฟล์ /tmp/.X11-unix/X0 ของฉันถูกลบออกแม้ว่าจะยังมีเซิร์ฟเวอร์ X ที่ทำงานอยู่ การรีบูตอย่างรวดเร็วดูเหมือนว่าจะแก้ไขปัญหาได้แล้ว อาจเกิดจากการอัปเดตบางอย่างที่ฉันทำไปสักพัก
John Doucette

6
การเปลี่ยนตัวแปร DISPLAY จาก ": 0.0" เป็น "localhost: 0.0" ดูเหมือนจะทำเคล็ดลับสำหรับฉันอย่างน้อยก็เชื่อมต่อจาก Cygwin เป็น Linux
m0j0

FWIW ผมต้องวิ่งstartxwin(หลังapt-cyg install xinit) จากcygwinโฮสต์เพราะฉันเชื่อมต่อ Windows ภายในระยะไกลยูนิกซ์
โจนาธาน

40

ฉันมีปัญหาเดียวกันกับ Cygwin และ Xming เชื่อมต่อกับเซิร์ฟเวอร์ Linux ระยะไกล

ตัวแปร $ DISPLAY ของฉันเป็นเพียง ": 0.0" ใน Cygwin และแม้ว่าจะใช้งานได้ในท้องถิ่น แต่ก็ไม่สามารถใช้ได้กับคำสั่ง ssh จากระยะไกล

การเปลี่ยนตัวแปรเป็น "localhost: 0.0" แก้ไขปัญหา

export DISPLAY=localhost:0.0

เมื่อฉันทำอย่างนั้นคำสั่งของฉันทำงาน:

ssh -Yf user@host gvim somefile.c

5
นี่เป็นปัญหาสำหรับฉันแม้แต่การใช้ Windows Services สำหรับ Linux
lapo

1
คุณเรียกใช้export ...คำสั่งบนเซิร์ฟเวอร์ใด 1) เครื่องโลคัล 2) เซิร์ฟเวอร์
หยุดทำงาน

1
@abalter มันใช้ได้กับฉันที่รันบนเครื่องท้องถิ่น
tralston

3
ผมใช้เวลา 2 ชั่วโมงปัญหาการแก้จุดบกพร่องกับ Cygwin SSH + VcXsrv DISPLAY=:0 ssh -Y $hostเพราะผมชุด เปลี่ยนเป็นDISPLAY=localhost:0ปัญหาที่แก้ไขได้อย่างน่าอัศจรรย์
gavenkoa

1
คำตอบที่ดียังคงเป็นประโยชน์ในการใช้ระบบย่อย Ubuntu ใน windows
Tom Swifty

6

นี่คือคำตอบที่เติมเต็มด้วยข้อมูลเฉพาะจากระบบย่อย 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 ของคุณ)


3

หากโฮสต์การแสดงผลของคุณเป็นmacOSตรวจสอบให้แน่ใจว่าคุณมีXQuartzแล้ว

ข้อความผิดพลาดนี้จะบอกคุณอุโมงค์ SSH คือการทำงาน แต่ก็ไม่สามารถคิดออกว่าจะเชื่อมต่อกับเซิร์ฟเวอร์ X บนด้านข้างของคุณของอุโมงค์

ในวันเก่า ๆ ที่ดีMac OS Xเคยเริ่มต้น XQuartz สำหรับคุณ แต่เราได้ละทิ้งคุณลักษณะเล็ก ๆ น้อย ๆ ที่ดีในเทอร์มินัลเวอร์ชันmacOS


ติดตาม: Invalid MIT-MAGIC-COOKIE-1 keyxterm Xt error: Can't open display: localhost:10.0หมายถึง "คุณต้องออกและ SSH กลับมาหลังจากเริ่ม XQuartz" FWIW ...
rogerdpack

1

ฉันมีปัญหาเดียวกัน สิ่งที่น่าสับสนก็คือคุณได้รับข้อผิดพลาดแบบไม่มีไฟล์บนเครื่องรีโมตแต่จริงๆแล้วไฟล์นี้หายไปบนเครื่องโลคัล (จอแสดงผล)

เพียงเพื่อดูว่าจะเกิดอะไรขึ้นฉันสร้างไฟล์ที่หายไปด้วยตนเอง (Fifo, จริง ๆ ) บนเครื่องแสดงผลเช่นนี้:

mkfifo /tmp/.X11-unix/X0

จากนั้นไปที่เครื่องระยะไกลอีกครั้งและดูเถิดและ X11 เชื่อมต่อได้ดี

ฉันไม่รู้ว่าสิ่งนี้เกี่ยวข้องหรือไม่ แต่เครื่องแสดงผลของฉันไม่ใช่ Linux เป็น Windows ที่มี cygwin และ VcXsrv (เครื่องระยะไกลคือ Linux)


4
/tmp/.X11-unix/X0เป็นซ็อกเก็ตโดเมน unix ไม่ใช่ FIFO
Samveen

0

ฉันวิ่งเข้าไปในปัญหานี้โดยใช้ระบบย่อย Windows สำหรับลินุกซ์ ปัญหาคือฉันไม่ได้ติดตั้ง GUI บนไคลเอนต์เนื่องจากข้อสันนิษฐานว่าเนื่องจากเป็นเครื่อง Windows ฉันมี GUI

เพื่อทดสอบว่าคุณมี GUI หรือไม่ให้ดำเนินการxclockกับไคลเอนต์ หากคุณได้รับข้อผิดพลาดError: Can't open display: :0คุณจะต้องติดตั้งโปรแกรม GUI สำหรับ Windows ผมใช้xserver

เมื่อคุณติดตั้ง GUI ลองคำสั่งต่อไปนี้:

export DISPLAY=:0
xclock

หากนาฬิกาเกิดขึ้นก็จะประสบความสำเร็จ!

ตอนนี้พยายาม ssh'ing xclockสู่เซิร์ฟเวอร์แล้วทำงาน คุณยังได้รับข้อความแสดงข้อผิดพลาดในการเชื่อมต่อ /tmp/.X11-unix/X0: ไม่มีไฟล์หรือไดเรกทอรีข้อผิดพลาด: ไม่สามารถเปิดการแสดง: localhost: 10.0 ? นั่นเป็นเพราะเซิร์ฟเวอร์พยายามเชื่อมต่อกับตัวเองเพื่อแสดง GUI คุณต้องการตั้งค่าตัวแปร DISPLAY เป็นที่อยู่ที่เซิร์ฟเวอร์สามารถรับคอมพิวเตอร์ของคุณได้ ดังนั้นหากใช้ LAN คุณจะต้องใส่ชื่อคอมพิวเตอร์ของคุณ หากคุณกำลังเชื่อมต่อกับเซิร์ฟเวอร์ใน WAN คุณจะต้องระบุ IP ภายนอกของเราเตอร์และส่งพอร์ตที่เหมาะสม

LAN: export DISPLAY=ComputerName:0
WAN:export DISPLAY=257.257.257.257:0


"การส่งต่อ X" หมายถึง "อุโมงค์ X โปรโตคอลจากแอปพลิเคชันที่ทำงานบนเครื่องระยะไกล (เซิร์ฟเวอร์ในกรณีของคุณ) ไปยังเครื่องภายใน (ลูกค้าในกรณีของคุณ)" ดังนั้นแน่นอนว่าคุณต้องใช้เซิร์ฟเวอร์ X (และไม่ "โปรแกรม GUI ใด ๆ ") บนเครื่องโลคอล Windows เองไม่เข้าใจโพรโทคอล X แม้ว่า "คุณมี GUI"
dirkt

-2

ถ้ามันทำงานได้ดีและหยุดทำงานโดยไม่มีเหตุผลที่เหมาะสมอาจเป็นได้ว่าอินสแตนซ์ X ที่ไม่สามารถควบคุมได้ทำงานในพื้นหลัง โปรดปิดสิ่งนั้นโดยใช้ตัวจัดการงาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.