Di mesin lokal saya, saya menjalankan:
ssh -X [email protected]
(Untuk kelengkapan, saya juga telah menguji semua hal berikut menggunakan -Y dengan hasil yang identik).
Seperti yang diharapkan, ini mengakses remotemachine.com dengan baik, dan semua tampak baik. Jika saya kemudian mencoba menjalankan xcalc, saya mendapatkan:
connect /tmp/.X11-unix/X0: No such file or directory
Error: Can't open display: localhost:10.0
Tapi,
$ 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
Jadi tidak hanya ada /tmp/.X11-unix/X0, ia memiliki izin universal r / w / x!
Saya sebelumnya menggunakan penerusan x tanpa masalah, meskipun tidak dalam beberapa waktu ...
uname -a di server untuk referensi:
Linux machinename 2.6.32-25-generic #45-Ubuntu SMP Sat Oct 16 19:52:42 UTC 2010 x86_64 GNU/Linux
Telah mencari-cari di web selama beberapa jam sekarang tanpa hasil. Lainnya menyebutkan masalah yang sama, tetapi tidak ada solusi.
strace -fo /tmp/trace ssh....
untuk memeriksa apakah ia mencoba menghubungkan soket domain Unix itu.Jawaban:
Jika Anda memiliki server X yang berjalan dan
DISPLAY
variabel lingkungan diatur ke:0
, itu memberitahu aplikasi untuk terhubung ke server X menggunakan soket domain unix yang umumnya dapat ditemukan di Linux di/tmp/.X11-unix/X0
(meskipun lihat di bawah tentang namespace abstrak di Linux baru-baru ini) .Ketika Anda ssh ke mesin remotemachine ,
sshd
pada remotemachine mengatur DISPLAY kelocalhost:10
(misalnya), yang kali ini berarti bahwa koneksi X dilakukan melalui TCP ke port 6010 dari mesin localhost. sshd on remotemachine mendengarkan koneksi di sana dan meneruskan koneksi yang masuk ke klien ssh. Klien ssh kemudian mencoba untuk terhubung ke/tmp/.X11-unix/X0
(pada ujung lokal, bukan remote) untuk menghubungi server X Anda.Sekarang, mungkin Anda tidak memiliki server X yang berjalan (apakah Anda menggunakan Mac?) Atau mungkin soket domain unix tidak dapat ditemukan di /tmp/.X11-unix yang berarti ssh belum dikonfigurasi dengan benar pada saat kompilasi waktu.
Untuk mengetahui apa jalur yang tepat untuk soket unix, Anda bisa mencoba
strace -e connect xlogo
(atau yang setara pada sistem Anda) pada mesin lokal Anda untuk melihat apa yang dilakukan aplikasi X normal.netstat -x | grep X
mungkin juga memberikan petunjuk.Sebagai catatan, pada mesin Wheezy Linux Debian di sini, Xorg mendengarkan pada kedua
/tmp/.X11-unix/X0
sistem file dan/tmp/.X11-unix/X0
pada namespace abstrak (umumnya ditulis@/tmp/.X11-unix/X0
). Daristrace
, aplikasi X11 tampaknya sekarang menggunakan namespace abstrak secara default, yang menjelaskan mengapa mereka masih berfungsi jika/tmp/.X11-unix
dihapus, sementarassh
tidak menggunakan namespace abstrak itu.sumber
lsof -p <PID of your local X server>
mana Anda harus dapat menemukan/some/thing/Xn
file,n
menjadiDISPLAY
nomor Anda .startxwin
(setelahapt-cyg install xinit
) daricygwin
tuan rumah karena saya menghubungkan Windows lokal ke remote unixSaya memiliki masalah yang sama dengan Cygwin dan Xming, menghubungkan ke server Linux jarak jauh.
Variabel $ DISPLAY saya hanya ": 0,0" di Cygwin, dan meskipun itu bekerja secara lokal, itu tidak bekerja dengan perintah ssh jarak jauh.
Mengubah variabel menjadi "localhost: 0,0" memperbaiki masalah.
Setelah saya melakukan itu, perintah saya berhasil:
sumber
export ...
perintah? 1) mesin lokal 2) serverDISPLAY=:0 ssh -Y $host
. Mengubahnya menjadiDISPLAY=localhost:0
masalah yang dipecahkan secara ajaib.Ini melengkapi jawaban lain dengan informasi spesifik dari Windows-Subsystem untuk Linux. The jawaban yang diterima adalah benar: Anda
DISPLAY
variabel tidak dikonfigurasi dengan benar. Namun, tidak terlalu jelas mengapa hanya dari jawaban itu saja, jadi saya memperbaiki dengan jawaban ini.Jika Anda menjalankan cygwin, atau Windows-Subsystem untuk Linux, dan server X11 Anda berbasis windows (misalnya
VcXsrv
, atauXMing
), kemungkinan server X11 Anda mendengarkan pada port TCP (seperti127.0.0.1
pada port TCP6000-6010
) daripada pada soket domain Unix default (/tmp/.X11-unix/X0
). Soket Unix tidak didukung dengan baik pada Windows saat ini, bahkan di dalam WSL. Berkomunikasi antara program-program di lingkungan seperti Linux dan program yang berjalan langsung pada host windows juga umumnya lebih mudah daripada soket IP.Ketika Anda menjalankan aplikasi grafis secara lokal (yaitu dari lingkungan Cygwin atau WSL dari host Anda), dan
DISPLAY
variabel Anda diatur ke default (yaituDISPLAY=:0.0
), aplikasi pertama-tama akan mencoba untuk terhubung ke server X melalui soket Unix/tmp/.X11-unix/X0
. Ini akan gagal, tetapi sebagian besar aplikasi kemudian akan mundur ke koneksi TCP aktiflocalhost
, yang seharusnya berhasil mencapai server, dengan asumsi server X Anda dikonfigurasi dengan default.Anda dapat mengonfirmasi bahwa ini terjadi dengan mencari
connect()
panggilan di strace log dari serangkaian aplikasi grafis Anda. Itu umumnya akan terjadi sejak dini, sebelum jendela utama aplikasi muncul.Perilaku mundur itu tidak terjadi ketika ssh mengarahkan koneksi dari sisi jarak jauh, sehingga Anda mendapatkan kesalahan itu.
sshd
memang meneruskan koneksi ke sisi lokal, tetapi koneksi lokal klien ssh menemui jalan buntu karena gagal menjangkau server melalui soket Unix. Anda kemudian mendapatkanENOENT
kesalahan.Dalam kasus seperti itu, mengubah
DISPLAY
variabel Anda untuk menggunakan sintaks TCP bukan:0.0
sintaks, dapat memperbaiki masalah:Seperti jawaban lain yang disebutkan, Anda juga dapat mengekspor variabel itu secara interaktif dari prompt shell Anda:
Anda juga dapat menyimpan pengaturan ini secara lebih permanen dengan menambahkan baris itu ke skrip inisialisasi profil shell login Anda (mis
~/.bash_profile
.).Catatan: Beberapa shell memiliki skrip inisialisasi yang berbeda untuk sesi login dan non-login. Misalnya, dengan bash Anda bisa menulis baris itu ke skrip non-login, yaitu
~/.bashrc
alih-alih~/.bash_profile
. Jika Anda melakukannya, berhati-hatilah untuk tidak menimpa nilai kustom apa pun yang mungkin telah ditetapkan oleh ssh. Itu akan menjadi kasus jika Anda melompat pertama ke host Anda melalui ssh dan kemudian melompat lagi ke host lain (sehingga bersarang forwarding X11 Anda).sumber
Jika host layar Anda adalah macOS , pastikan Anda menjalankan XQuartz .
Pesan kesalahan ini memberi tahu Anda terowongan ssh berfungsi, tetapi tidak tahu cara menyambung ke server X di sisi terowongan Anda .
Di masa lalu yang indah, Mac OS X digunakan untuk memulai XQuartz untuk Anda, tetapi kami tampaknya telah meninggalkan fitur kecil yang menyenangkan ini di terminal versi macOS .
sumber
Invalid MIT-MAGIC-COOKIE-1 keyxterm Xt error: Can't open display: localhost:10.0
berarti "Anda harus keluar dan SSH kembali setelah memulai XQuartz" FWIW ...Saya hanya punya masalah yang sama. Yang membingungkan adalah Anda mendapatkan kesalahan tidak-seperti-file pada mesin jarak jauh , tetapi sebenarnya file ini hilang pada mesin (tampilan) lokal .
Hanya untuk melihat apa yang akan terjadi, saya secara manual membuat file yang hilang (fifo, sebenarnya), pada mesin display, seperti ini:
Kemudian ssh'ed ke mesin jarak jauh lagi, dan lihatlah, X11 terhubung dengan baik.
Saya tidak tahu apakah ini relevan atau tidak, tetapi mesin display saya bukan Linux, ini Windows dengan cygwin dan VcXsrv. (Mesin remote adalah Linux)
sumber
/tmp/.X11-unix/X0
adalah soket domain unix, bukan FIFOSaya mengalami masalah ini menggunakan Subsistem Windows untuk Linux . Masalahnya adalah saya tidak memiliki GUI yang diinstal pada klien, karena asumsi bahwa karena ini adalah mesin Windows, saya memiliki GUI.
Untuk menguji apakah Anda memiliki GUI, jalankan
xclock
pada klien. Jika Anda mendapatkan kesalahanError: Can't open display: :0
maka Anda harus menginstal program GUI untuk Windows. Saya menggunakan Xserver .Setelah Anda menginstal GUI, coba perintah berikut:
Jika sebuah jam muncul, maka sukseslah!
Sekarang coba ssh'ing ke server, lalu jalankan
xclock
. Apakah Anda masih mendapatkan pesan kesalahan terhubung /tmp/.X11-unix/X0: Tidak ada file atau direktori seperti itu Kesalahan: Tidak dapat membuka tampilan: localhost: 10.0 ? Itu karena server sedang mencoba untuk terhubung ke dirinya sendiri untuk menampilkan GUI. Alih-alih, Anda ingin variabel DISPLAY disetel ke alamat yang memungkinkan server mendapatkan komputer Anda. Jadi jika itu di LAN, Anda hanya akan memasukkan nama komputer Anda. Jika Anda terhubung ke server di WAN, maka Anda perlu menentukan IP eksternal router Anda dan memiliki port yang tepat diteruskan.LAN:
export DISPLAY=ComputerName:0
WAN:
export DISPLAY=257.257.257.257:0
sumber
Jika itu berfungsi dengan baik dan berhenti bekerja tanpa alasan yang tepat, Mungkin itu bisa menjadi contoh X yang tidak terkendali berjalan di latar belakang. Harap tutup yang menggunakan pengelola tugas.
sumber