Sekali waktu,
DISPLAY=:0.0 totem /path/to/movie.avi
setelah ssh masuk ke desktop saya dari laptop saya akan menyebabkan totem memutar movie.avi
di desktop saya.
Sekarang ini memberikan kesalahan:
No protocol specified Cannot open display:
Saya menginstal ulang pemerasan Debian ketika sudah stabil di kedua komputer, dan saya kira saya merusak konfigurasi.
Saya telah mencari di Google tentang ini, dan seumur hidup saya tidak dapat mengetahui 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 tugas cron.
Jawaban yang Diterima:
(Diadaptasi dari Linux:wmctrl tidak dapat membuka tampilan saat sesi dimulai melalui ssh+screen)
TAMPILAN dan OTORITAS
Program X membutuhkan dua informasi untuk terhubung ke layar X.
-
Itu membutuhkan alamat tampilan, yang biasanya
:0
saat Anda masuk secara lokal atau:10
,:11
, dll. ketika Anda masuk dari jarak jauh (tetapi jumlahnya dapat berubah tergantung pada berapa banyak koneksi X yang aktif). Alamat tampilan biasanya ditunjukkan dalamDISPLAY
variabel lingkungan. -
Ini membutuhkan kata sandi untuk tampilan. Kata sandi tampilan X disebut kuki ajaib . Cookie ajaib tidak ditentukan secara langsung:cookie selalu disimpan dalam file otoritas X, yang merupakan kumpulan catatan dalam bentuk “tampilan
:42
memiliki cookie123456
”. File otoritas X biasanya ditunjukkan dalamXAUTHORITY
variabel lingkungan. 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 tampilannya adalah :0
. Menemukan lokasi file otoritas X lebih sulit, karena dengan gdm yang diatur di bawah pemerasan Debian atau Ubuntu 10.04, itu ada dalam file dengan nama yang dibuat secara acak. (Anda tidak memiliki masalah sebelumnya karena versi gdm sebelumnya menggunakan pengaturan default, yaitu cookie yang disimpan di ~/.Xauthority
.)
Mendapatkan nilai variabel
Berikut adalah beberapa cara untuk mendapatkan nilai DISPLAY
dan XAUTHORITY
:
-
Anda dapat memulai sesi layar secara sistematis dari desktop Anda, mungkin secara otomatis di skrip login Anda (dari
~/.profile
; tetapi lakukan hanya jika masuk di bawah X:uji apakahDISPLAY
diatur ke nilai yang dimulai dengan:
(yang harus mencakup semua kasus yang mungkin Anda temui)). Di~/.profile
:case $DISPLAY in :*) screen -S local -d -m;; esac
Kemudian, di sesi ssh:
screen -d -r local
-
Anda juga dapat menyimpan nilai
DISPLAY
danXAUTHORITY
dalam file dan mengingat nilainya. Di~/.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
danXAUTHORITY
dari proses yang berjalan. Ini lebih sulit untuk diotomatisasi. Anda harus mengetahui PID dari proses yang terhubung ke tampilan yang ingin Anda kerjakan, lalu dapatkan variabel lingkungan dari/proc/$pid/environ
(eval export $(</proc/$pid/environ tr \0 \n | grep -E '^(DISPLAY|XAUTHORITY)=')
).
Menyalin cookie
Pendekatan lain (mengikuti saran oleh Arrowmaster) adalah tidak mencoba untuk mendapatkan nilai $XAUTHORITY
di sesi ssh, tetapi untuk membuat sesi X menyalin cookie-nya ke ~/.Xauthority
. Karena cookie dibuat setiap kali Anda masuk, tidak masalah jika Anda menyimpan nilai lama di ~/.Xauthority
.
Mungkin ada masalah keamanan jika direktori home Anda dapat diakses melalui NFS atau sistem file jaringan lain yang memungkinkan administrator jarak jauh untuk melihat isinya. Mereka masih perlu terhubung ke mesin Anda, kecuali Anda telah mengaktifkan koneksi X TCP (Debian menonaktifkannya secara default). Jadi bagi kebanyakan orang, ini tidak berlaku (tidak ada NFS) atau tidak menjadi masalah (tidak ada koneksi X TCP).
Untuk menyalin cookie saat Anda masuk ke sesi X desktop Anda, tambahkan baris berikut ke ~/.xprofile
atau ~/.profile
(atau skrip lain yang dibaca saat 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 berisi metakarakter shell apa pun.