Dahulu kala,
DISPLAY=:0.0 totem /path/to/movie.avi
setelah ssh ke desktop saya dari laptop saya akan menyebabkan totem bermain movie.avi
di desktop saya.
Sekarang ini memberikan kesalahan:
No protocol specified Cannot open display:
Saya menginstal ulang Debian memeras ketika berjalan stabil di kedua komputer, dan saya kira saya melanggar konfigurasi.
Saya sudah mencarinya di Google, dan tidak bisa seumur hidup saya mencari tahu apa yang seharusnya saya lakukan.
(VLC memiliki antarmuka HTTP yang berfungsi, tetapi tidak senyaman ssh.)
Masalah yang sama muncul ketika saya mencoba menjalankan ini dari pekerjaan cron.
(Diadaptasi dari Linux: wmctrl tidak dapat membuka tampilan ketika sesi dimulai melalui ssh + layar )
Program X membutuhkan dua informasi untuk dapat terhubung ke tampilan X.
Dibutuhkan alamat tampilan, yang biasanya :0
Ketika Anda login secara lokal atau :10
, :11
, Dll. Ketika Anda login jarak jauh (tetapi nomor dapat berubah tergantung pada berapa banyak koneksi X aktif). Alamat tampilan biasanya ditunjukkan dalam variabel lingkungan DISPLAY
.
Perlu kata sandi untuk tampilan. Kata sandi tampilan X disebut cookie ajaib . Cookie ajaib tidak ditentukan secara langsung: cookie selalu disimpan dalam file otoritas X, yang merupakan kumpulan catatan dari bentuk “display :42
Memiliki cookie 123456
”. File otoritas X biasanya ditunjukkan dalam variabel lingkungan XAUTHORITY
. Jika $XAUTHORITY
Tidak disetel, program menggunakan ~/.Xauthority
.
Anda mencoba untuk bertindak di jendela yang ditampilkan di desktop Anda. Jika Anda satu-satunya orang yang menggunakan mesin desktop Anda, kemungkinan besar nama tampilan adalah :0
. Menemukan lokasi file otoritas X lebih sulit, karena dengan gdm yang diatur di bawah Debian squeeze atau Ubuntu 10.04, file tersebut berada dalam file dengan nama yang dibuat secara acak. (Anda tidak memiliki masalah sebelumnya karena versi sebelumnya dari gdm menggunakan pengaturan default, yaitu cookie yang disimpan di ~/.Xauthority
.)
Berikut adalah beberapa cara untuk mendapatkan nilai DISPLAY
dan XAUTHORITY
:
Anda dapat secara sistematis memulai sesi layar dari desktop Anda, mungkin secara otomatis di skrip login Anda (dari ~/.profile
; Tetapi lakukan hanya jika masuk di bawah X: test if DISPLAY
diatur ke nilai awal dengan :
(yang harus mencakup semua kasus yang mungkin Anda temui)). Dalam ~/.profile
:
case $DISPLAY in
:*) screen -S local -d -m;;
esac
Kemudian, di sesi ssh:
screen -d -r local
Anda juga bisa menyimpan nilai DISPLAY
dan XAUTHORITY
dalam sebuah file dan mengingat kembali nilainya. Dalam ~/.profile
:
case $DISPLAY in
:*) export | grep -E '(^| )(DISPLAY|XAUTHORITY)=' >~/.local-display-setup.sh;;
esac
Dalam sesi ssh:
. ~/.local-display-setup.sh
screen
Anda dapat mendeteksi nilai DISPLAY
dan XAUTHORITY
dari proses yang sedang berjalan. Ini lebih sulit untuk diotomatisasi. Anda harus mengetahui PID dari proses yang terhubung ke tampilan yang ingin Anda kerjakan, kemudian dapatkan variabel lingkungan dari /proc/$pid/environ
(eval export $(</proc/$pid/environ tr \\0 \\n | grep -E '^(DISPLAY|XAUTHORITY)=')
¹).
Pendekatan lain (mengikuti saran oleh Arrowmaster ) adalah untuk tidak mencoba mendapatkan nilai $XAUTHORITY
Di sesi ssh, tetapi sebagai gantinya membuat sesi X menyalin cookie-nya ke ~/.Xauthority
. Karena cookie dihasilkan setiap kali Anda masuk, itu tidak masalah jika Anda menyimpan nilai basi di ~/.Xauthority
.
Mungkin ada masalah keamanan jika direktori rumah Anda dapat diakses melalui NFS atau sistem file jaringan lainnya yang memungkinkan administrator jarak jauh untuk melihat isinya. Mereka masih harus terhubung ke mesin Anda, kecuali jika Anda telah mengaktifkan koneksi X TCP (Debian menonaktifkannya secara default). Jadi bagi kebanyakan orang, ini tidak berlaku (tidak NFS) atau bukan masalah (tidak ada X TCP).
Untuk menyalin cookie ketika Anda masuk ke sesi X desktop Anda, tambahkan baris berikut ke ~/.xprofile
Atau ~/.profile
(Atau skrip lain yang dibaca ketika Anda masuk):
case $DISPLAY:$XAUTHORITY in
:*:?*)
# DISPLAY is set and points to a local display, and XAUTHORITY is
# set, so merge the contents of `$XAUTHORITY` into ~/.Xauthority.
XAUTHORITY=~/.Xauthority xauth merge "$XAUTHORITY";;
esac
¹ Pada prinsipnya ini tidak memiliki kutipan yang tepat, tetapi dalam contoh khusus ini $DISPLAY
Dan $XAUTHORITY
Tidak akan mengandung metacharacter Shell apa pun.
Saya memecahkan masalah ini dengan menambahkan
xhost +si:localuser:$USER
untuk ~/.xprofile
. Saya tidak tahu apakah ini sepenuhnya aman (saya akan sangat tertarik untuk mendengar apa yang dipikirkan orang yang lebih berpengetahuan), tapi saya menduga itu jauh lebih baik daripada mematikan kontrol akses (dengan xhost +
) seperti yang umum disarankan saat Anda google untuk masalah ini.
Kamu butuh export DISPLAY=:0.0
Bekerja untuk saya, debian wheezy -> ubuntu trusty.
Catatan: dalam hal ini server tidak menjalankan manajer tampilan, ini adalah mesin virtual 'tanpa kepala' tanpa kartu grafis atau monitor terpasang.
[email protected]:~$ grep -iB 1 tcp /etc/gdm3/daemon.conf
[security]
DisallowTCP = false
[email protected]:~$ ssh -C -R 6000:127.0.0.1:6000 [email protected]
X11 forwarding request failed on channel 0
[email protected]:~$ export DISPLAY=:0.0
[email protected]:~$ xterm
Layar X pada laptop menunjukkan output xterm yang berjalan di server.
Debug menggunakan:
[email protected]:~/tmp$ nc -v 127.0.0.1 6001
localhost [127.0.0.1] 6001 (x11-1) : Connection refused
[email protected]:~/tmp$ nc -v 127.0.0.1 6000
localhost [127.0.0.1] 6000 (x11) open
[email protected]:~$ nc -v 127.0.0.1 6000
Connection to 127.0.0.1 6000 port [tcp/x11] succeeded!*
[email protected]:~$ strace xterm
strace
akan menumpahkan banyak detail berdarah tentang apa yang dilakukannya, Anda harus dapat menebak di mana ia macet - menunggu koneksi atau apa pun.
Dalam satu baris ..
ssh -C -R 6000:127.0.0.1:6000 [email protected] "DISPLAY=:0.0 xterm"