it-swarm-id.com

Buka jendela pada tampilan X jarak jauh (mengapa "Tidak bisa membuka layar")?

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.

83
justin cress

(Diadaptasi dari Linux: wmctrl tidak dapat membuka tampilan ketika sesi dimulai melalui ssh + layar )

DISPLAY dan OTORITAS

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.)

Mendapatkan nilai-nilai variabel

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)=') ¹).

Menyalin cookie

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.

20
edam

Kamu butuh export DISPLAY=:0.0

7
asoundmove

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"
3
jmullee