it-swarm-tr.com

Uzak X ekranda bir pencere açın (neden "Ekran açılamıyor")?

Bir Zamanlar,

DISPLAY=:0.0 totem /path/to/movie.avi

dizüstü bilgisayarımdan masaüstüme ssh yaptıktan sonra totem oynamasına neden olur movie.avi masaüstümde.

Şimdi hata veriyor:

No protocol specified
Cannot open display:

Her iki bilgisayarda da kararlı hale geldiğinde Debian sıkmayı yeniden kurdum ve sanırım yapılandırmayı kırdım.

Bunun üzerine çalıştım ve hayatım boyunca ne yapmam gerektiğini anlayamıyorum.

(VLC'nin çalışan bir HTTP arayüzü var, ancak ssh kadar kullanışlı değil.)

Aynı sorun, bunu bir cron işinden çalıştırmaya çalıştığımda ortaya çıkıyor.

83
justin cress

( Linux: wmctrl, ssh + screen aracılığıyla oturum başlatıldığında ekranı açamıyor )

EKRAN ve YETKİ

Bir X programının bir X ekranına bağlanmak için iki bilgiye ihtiyacı vardır.

  • Yerel olarak oturum açtığınızda tipik olarak :0 veya uzaktan oturum açtığınızda :10, :11, vb. Olan ekranın adresine ihtiyacı vardır (ancak sayı kaç X bağlantısının etkin olduğuna bağlı olarak değişebilir). Ekranın adresi normalde DISPLAY ortam değişkeninde belirtilir.

  • Ekran için parola gerekiyor. X ekran şifreleri sihirli çerezler olarak adlandırılır. Sihirli çerezler doğrudan belirtilmez: her zaman X görüntüleyici dosyalarında saklanırlar; bunlar “display :42, çerez 123456'ye sahiptir” biçimindeki kayıtların bir koleksiyonudur. X yetki dosyası normalde XAUTHORITY ortam değişkeninde belirtilir. $XAUTHORITY ayarlanmamışsa, programlar ~/.Xauthority kullanır.

Masaüstünüzde görüntülenen pencerelerde işlem yapmaya çalışıyorsunuz. Masaüstü makinenizi kullanan tek kişi sizseniz, görünen adın :0 olması muhtemeldir. X yetki dosyasının konumunu bulmak daha zordur, çünkü Debian sıkıştırması veya Ubuntu 10.04 altında ayarlanan gdm ile rastgele oluşturulmuş bir ada sahip bir dosyadadır. (Daha önce sorun yaşamadınız çünkü gdm'nin önceki sürümleri varsayılan ayarı kullanmıştır, yani ~/.Xauthority'de saklanan çerezler.)

Değişkenlerin değerlerinin elde edilmesi

DISPLAY ve XAUTHORITY değerlerini almanın birkaç yolu:

  • Masaüstünüzden, oturum açma komut dosyalarınızda (~/.profile'den; otomatik olarak) bir ekran oturumu başlatabilirsiniz; ancak bunu yalnızca X altında oturum açıyorsanız yapın: DISPLAY'nin : ile başlayan bir değere ayarlanmış olup olmadığını test edin (tüm durumları kapsamalıdır) karşılaşma olasılığınız)). ~/.profile içinde:

    case $DISPLAY in
      :*) screen -S local -d -m;;
    esac
    

    Sonra, ssh oturumunda:

    screen -d -r local
    
  • Ayrıca DISPLAY ve XAUTHORITY değerlerini bir dosyaya kaydedebilir ve değerleri geri çağırabilirsiniz. ~/.profile içinde:

    case $DISPLAY in
      :*) export | grep -E '(^| )(DISPLAY|XAUTHORITY)=' >~/.local-display-setup.sh;;
    esac
    

    Ssh oturumunda:

    . ~/.local-display-setup.sh
    screen
    
  • Çalışan bir işlemden DISPLAY ve XAUTHORITY değerlerini tespit edebilirsiniz. Bunu otomatikleştirmek daha zordur. Üzerinde çalışmak istediğiniz ekrana bağlı bir işlemin PID'sini bulmanız, ardından /proc/$pid/environ (eval export $(</proc/$pid/environ tr \\0 \\n | grep -E '^(DISPLAY|XAUTHORITY)=') ¹) ortam değişkenlerini almanız gerekir.

Çerezleri kopyalama

Başka bir yaklaşım ( Arrowmaster önerisini takiben) ssh oturumunda $XAUTHORITY değerini elde etmeye çalışmak yerine X oturumunun çerezlerini ~/.Xauthority'e kopyalamasını sağlamaktır. Çerezler her giriş yaptığınızda oluşturulduğundan, eski değerleri ~/.Xauthority içinde tutarsanız sorun olmaz.

Ana dizininize NFS veya uzak yöneticilerin içeriğini görüntülemesine izin veren başka bir ağ dosya sistemi üzerinden erişilebiliyorsa güvenlik sorunu olabilir. X TCP bağlantıları (Debian bunları varsayılan olarak devre dışı bırakmıştır) etkinleştirmedikçe, yine de bir şekilde makinenize bağlanmaları gerekir. Bu yüzden çoğu insan için bu geçerli değildir (hayır NFS) veya sorun değil (X TCP bağlantı yok).

Masaüstü X oturumunuzda oturum açtığınızda çerezleri kopyalamak için ~/.xprofile veya ~/.profile (veya oturum açtığınızda okunan başka bir komut dosyasına) aşağıdaki satırları ekleyin:

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

¹ Prensipte bunun uygun alıntıları yoktur, ancak bu özel durumda $DISPLAY ve $XAUTHORITY herhangi bir Shell metakaraktı içermeyecektir.

Bu sorunu ekleyerek çözdüm

xhost +si:localuser:$USER

için ~/.xprofile. Bunun tamamen güvenli olup olmadığını bilmiyorum (daha bilgili halkın ne düşündüğünü duymak isterim), ancak erişim kontrolünü kapatmaktan çok daha iyi olduğunu tahmin ediyorum (xhost +) bu sorun için Google'da yaygın olarak önerildiği gibi.

20
edam

Gerek export DISPLAY=:0.0

7
asoundmove

Benim için çalışıyor, debian wheezy -> ubuntu güvenilir.

Not: Bu durumda sunucu bir ekran yöneticisi çalıştırmaz, grafik kartı veya monitörü takılı olmayan 'başsız' bir sanal makinedir.

[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

Dizüstü bilgisayarda X ekran, sunucuda çalışan xterm çıkışını gösterir.

Hata ayıklama:

[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 ne yaptığı hakkında çok fazla kanlı bilgi akıtır, nerede takıldığını tahmin edebilmeniz gerekir - bir bağlantıyı ya da herhangi bir şeyi beklemek.

Tek satırda ..

ssh -C -R 6000:127.0.0.1:6000 [email protected] "DISPLAY=:0.0 xterm"
3
jmullee