Uzaktaki X ekranında bir pencere açın (neden “Ekran açılamıyor”)?


81

Bir Zamanlar,

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

dizüstü bilgisayarımdan masaüstüme girdikten sonra, totem'in masaüstümde oynamasına neden olur movie.avi.

Şimdi hata veriyor:

No protocol specified
Cannot open display:

Her iki bilgisayarda da sabitlendiğinde Debian sıkıştırmasını yeniden kurdum ve sanırım config'i kırdım.

Bu konuda googledim ve hayatım boyunca ne yapmam gerektiğini çözemedim.

(VLC çalışan bir HTTP arayüzüne sahiptir, ancak ssh kadar uygun değildir.)

Bunu bir cron işinden çalıştırmaya çalıştığımda da aynı sorun ortaya çıkıyor.


1
Uzak makinenizde .Xauthority dosyası var mı? Diğer açık soru şudur - ssh sunucunuz ve istemciniz X yönlendirmesine izin verecek şekilde yapılandırılmış mı? Ssh için hangi komutu kullandınız?
Faheem Mitha

1
X'i iletmeye mi çalışıyorum? Komutun istemcide değil ana bilgisayarda çalıştırılmasını istiyorum. Ssh komutum sadece ssh me @ host 'u bulun...
justin

Faheem'in önerdiği gibi, sorununuzun totemX çerezinizi bulamaması nedeniyle iyi bir değişiklik olabilir ve XAUTHORITYmasaüstünüzde normal oturumunuzdaki değer gibi uygun bir değere ayarlamanız gerekir . Linux Oku : bazı arka plan için oturum ssh + ekranıyla başlatıldığında wmctrl ekranı açamaz ; ayrıca ilgili cevabı gör Ayrıca root olarak başka bir kullanıcının masaüstünde bir grafik programını başlatabilir miyim? .
Gilles

1
Tamam, fiziksel olarak bilgisayarda otururken ve echo $ XAUTHORITY yazarak ssh oturumunda / var / run / gdm3 / jcress-bb32gX / veritabanı / ssh oturumunda echo $ DISPLAY = (yukarıdaki yol) yazılmazsa
justin cress

1
Ben sadece tutmuş yüzden gelemedi GDM3, suçlamak $XAUTHORITYde ~/.Xauthorityherkes bunun olmasını bekler gibi.
Arrowmaster

Yanıtlar:


78

( Linux'tan uyarlanmıştır : wmctrl, oturum ssh + ekranı ile başlatıldığında ekranı açamaz )

EKRAN ve YETKİ

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

  • Bu genellikle ekran, adresini ihtiyacı :0yerel olarak veya giriş yaptığınızda :10, :11vb uzaktan Giriş yaptıktan (ancak sayı aktif kaç X bağlantıları bağlı olarak değişebilir) ne zaman. Ekranın adresi normal olarak DISPLAYortam değişkeninde belirtilir .

  • Ekran için şifreye ihtiyacı var. X ekran şifrelerine sihirli kurabiye denir . Sihirli çerezler doğrudan belirtilmez: daima “ekranın :42çerezleri vardır 123456” şeklinde bir kayıt koleksiyonu olan X yetki dosyalarında saklanırlar . X yetki dosyası normalde XAUTHORITYortam değişkeninde gösterilir. Eğer $XAUTHORITYayarlı değil, programlar kullanın ~/.Xauthority.

Masaüstünüzde görüntülenen pencerelerde hareket etmeye çalışıyorsunuz. Masaüstü makinenizi kullanan tek kişi sizseniz, görünen adın büyük olasılıkla :0. X otorite dosyasının yerini bulmak daha zordur, çünkü Debian sıkıştırması veya Ubuntu 10.04 altında ayarlanan gdm ile rastgele oluşturulmuş bir isimle dosyadadır. (Daha önce hiç sorun yaşamadığınızdan, çünkü gdm'nin önceki sürümleri varsayılan ayarı kullandı, yani çerezleri sakladı ~/.Xauthority.)

Değişkenlerin değerlerini almak

İşte değerlerini elde etmek için birkaç yolu vardır DISPLAYve XAUTHORITY:

  • Sen sistematik dan giriş komut (belki de otomatik olarak masaüstünüzden bir ekran oturumu başlatabilirsiniz ~/.profile; ancak yalnızca X altında giriş yapmanız: testini eğer DISPLAYile başlayan bir değere ayarlanır :(yani bütün davaları sen olasıdır kapsamalıdır karşılaşmak)). İçinde ~/.profile:

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

    Ardından, ssh oturumunda:

    screen -d -r local
    
  • Ayrıca değerlerini kurtarabilir DISPLAYve XAUTHORITYbir dosyada ve değerleri hatırlama. İçinde ~/.profile:

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

    Ssh oturumunda:

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

Çerezleri kopyalamak

Başka bir yaklaşım ( Arrowmaster'ın önerisini takiben ) $XAUTHORITYssh oturumunun değerini almaya çalışmak değil , bunun yerine X oturumunun çerezlerini kopyalamasını sağlamaktır ~/.Xauthority. Her giriş yaptığınızda çerezler oluşturulduğundan, eski değerleri içeride tutarsanız sorun olmaz ~/.Xauthority.

Ana dizininize NFS üzerinden veya uzaktan yöneticilerin içeriğini görüntülemesine izin veren başka bir ağ dosya sistemi üzerinden erişilebiliyorsa, bir güvenlik sorunu olabilir. X TCP bağlantılarını etkinleştirmediyseniz, (Debian bunları varsayılan olarak devre dışı bırakmaz), bir şekilde makinenize bağlanmaları gerekirdi. Bu yüzden çoğu insan için, bu ya geçerli değildir (NFS yoktur) ya da bir sorun değildir (X TCP bağlantısı yoktur).

Masaüstü X oturumunuza giriş yaparken çerezleri kopyalamak için, aşağıdaki satırları ~/.xprofileya da ~/.profile(ya da giriş yaptığınızda okunan başka bir komut dosyasını) 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 bu, uygun fiyatlandırmadan yoksundur, ancak bu özel durumda $DISPLAYve $XAUTHORITYherhangi bir kabuk meta karakter içermez.


2
Bunu otomatikleştirmenin bir yolu, ~/.xprofileyalnızca X oturumu sırasında çalıştırılması gereken bir tane oluşturmak ~/.Xauthorityve doğru bilgiyle oluşturmasını / güncellemesini sağlamaktır. Sembolik bir bağlantı yeterli olur mu?
Arrowmaster

@Arrowmaster: Bu iyi bir öneri. Düşünmedim. Her durumda işe yaramaz, örneğin birden fazla X oturumuna giriş yaparsanız (farklı terminallerde, vnc,…), ancak basit ve tipik kullanım için yeterlidir. Sembolik bir bağlantı en iyi yoldur. Hmm, aslında daha iyi ve basit bir yol var: bilgileri kopyalayabilirsiniz~/.Xauthority .
Gilles

1
Gibi bir şey koyarak misiniz xauth extract - $DISPLAY | xauth -f "$HOME/.Xauthority" merge -içinde ~/.xprofilebirden $ EKRAN en olayını çözmek?
Arrowmaster

@Arrowmaster: Birden fazla ekranla hangi sorunu görüyorsunuz? Kodunuz prensip olarak biraz daha temiz olsa da, yalnızca ilgilendiğiniz ekranla ilgili bilgileri ayıkladığınızdan dolayı, sorucunun durumunda basit bir birleştirme ile veya gerçekten çok olağandışı durumlar dışında yanlış bir şey görmüyorum.
Gilles

1
Çevreyi ekrana bağlı mevcut bir işlemden okumak, kötü bir şey olduğu düşünülmez. Gönülden onaylıyorum. Unix.SE'nin bunun için bir Evil Genius ™ rozetine ihtiyacı var.
derobert

19

Ekleyerek bu sorunu çözdüm

xhost +si:localuser:$USER

için ~/.xprofile. Bu (ı daha bilgili halk ne düşündüğünü duymak çok ilgi duyarım) sabitlemek tamamen olup olmadığını bilmiyorum, ama (ile erişim kontrolü kapatarak çok daha iyi olduğunu tahmin ediyorum xhost +yaygın sizi sürülmektedir gibi) bu sorun için google.


1
localusersunucu tarafından tercüme edilen adresler tamamen güvenlidir. Debian bunu varsayılan olarak oturum açma işleminin bir parçası olarak da yapar (in /etc/X11/Xsession.d/35x11-common_xhost-local). Daha fazla bilgi için Xsecurity man sayfasına bakınız.
Sam Morris,

LAN kullanıyorsanız, xhost +çoğu durumda muhtemelen yeterlidir ...
Alexis Wilke

Bu komutun ne anlama geldiğini açıklayabilir misiniz?
alpha_989

@ alpha_989: "[$ USER] olarak çalışan herhangi bir yerel olarak çalışan [yerel kullanıcı] uygulamasına erişim [+] izni ver" anlamına geliyor. "Si" sadece bir yapıştırıcıdır ( dokümanlar için xhost(1)ve bakınız Xsecurity(7)). Kendi başına, bu komut yok değil uzaktan erişim veya X11 yönlendirmesi (bunlar için "sihirli çerez" mekanizması genellikle daha çok tercih edilir her türlü izin xhost).
Kevin

7

Gerek export DISPLAY=:0.0


Hayır. Değişken aynı satıra yazıldığında Unix dışa aktarma gerektirmez. Bu değişken, çizgi bitene kadar etkilidir.
Alexis Wilke

Gerçekten de haklısın.
asoundmove

Bu cevap kesinlikle yanlıştır ve silinmelidir.
Piotr Dobrogost

Sadece DISPLAY yazmayı bilmiyordum =: 0.0 değişken ismini ayarlardı. @ Asoundmove 'e teşekkür ederiz. Ancak, düşünüyorum: 0.0 sunucu ekranında DISPLAY değişkeni değeridir. Putty'den giriş yapıyorsanız, DISPLAY değişkeni 10 veya daha yüksek olmalıdır. bu yüzden DISPLAY =: 10
alpha_989

3

Benim için çalışıyor, debian wheezy -> ubuntu trusty.

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

bob@laptop:~$ grep -iB 1 tcp /etc/gdm3/daemon.conf
[security]
DisallowTCP = false
bob@laptop:~$ ssh -C -R 6000:127.0.0.1:6000 alice@server
X11 forwarding request failed on channel 0
alice@server:~$ export DISPLAY=:0.0
alice@server:~$ xterm

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

Kullanarak hata ayıklama:

bob@laptop:~/tmp$ nc -v 127.0.0.1 6001
localhost [127.0.0.1] 6001 (x11-1) : Connection refused
bob@laptop:~/tmp$ nc -v 127.0.0.1 6000
localhost [127.0.0.1] 6000 (x11) open
alice@server:~$ nc -v 127.0.0.1 6000
Connection to 127.0.0.1 6000 port [tcp/x11] succeeded!*
alice@server:~$ strace xterm

strace Yaptığı şey hakkında çok fazla ayrıntıyı aktaracak, nerede sıkışıp kaldığını tahmin edebilmelisin - bir bağlantı ya da her neyse.

Bir satırda ..

ssh -C -R 6000:127.0.0.1:6000 alice@server "DISPLAY=:0.0 xterm"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.