Neden GUI uygulamalarını 'root' adresinden çalıştıramıyorum: “Protokol belirtilmedi”?


38

Dün gece makineme debian kurdum. Şimdi, root olarak çalıştırırken neden bir terminalden GUI uygulamalarını çalıştıramadığımı anlamıyorum.

Örneğin:

sudo -i
glxgears

Aşağıdaki çıktıyı oluşturur:

No protocol specified
Error: couldn't open display :0

Ancak terminali ilk açtığımda glxgearskullanıcı hesabından koşabilirim . Sadece bunu yaptıktan sonra sudo -isorun çözülür. Bu, çalıştırmayı denediğim herhangi bir GUI uygulaması için oluyor. Muhtemelen X11 ile ilgili olduğunu düşünüyorum, ancak emin değilim.


1
stackoverflow.com/a/20612084 Bu benim için mükemmel çalıştı.

Yanıtlar:


39

X sunucusuna erişmek iki şey gerektirir:

  • $DISPLAYDoğru göstergeye işaret eden değişken (genellikle :0)
  • Doğru kimlik doğrulama bilgisi

Kimlik doğrulama bilgisi ile açıkça belirtilebilir $XAUTHORITYve varsayılan olarak ~/.Xauthorityaksi belirtilebilir.

Eğer $DISPLAYve $XAUTHORITYsizin kullanıcı için ayarlanır, sudoçok yeni kabuk için de belirleyebilirsiniz olacak ve her şey para cezası çalışmalıdır.

Eğer ayarlanmamışlarsa, muhtemelen yanlış değerlere varsayılan olacaktır ve siz ve X uygulamalarını başlatamazsınız.

Debian'da $XAUTHORITYgenellikle açıkça belirlenmez. Sadece ekle

export XAUTHORITY=~/.Xauthority

sizin .bashrcya da açıkça söyleyince XAUTHORITY=~/.Xauthority sudo ...her şey işe yaramalı.

xauth listDoğru kimlik doğrulama bilgilerinin mevcut olup olmadığını kontrol etmek için de kullanabilirsiniz .


1
xauth infoyetki dosyasına gösterileri yolu
Tomas Tomecek

1
xhost +sorunumu çözdü
tehlike89

3
Unutmayın xhost +tamamen kimlik devre dışı bırakır ve izin veren erişime ekrandaki tüm uygulama için herkes ...
Michas

1
debian için, XAUTHORITY ihracatını root olarak mı yazarım? çünkü deb10'da çalışmıyor? Sudo su ile giriş yaptım
marinara

@ marinara sudo -iyerine kullanın sudo su -.
michas

23

Seninle aynı soruyu sordum ama normal bir kullanıcı için. Foo kullanıcı hesabını kullanarak firefox'u başlatmak istediğimi varsayalım. Bar olarak giriş yaptım:

[bar@localhost ~]$ sudo -u foo -H firefox

Maalesef, bu komut sorudakiyle aynı hatayla başarısız oldu (örn. Protokol belirtilmedi ve ekranı açamıyor)

Benim çözümüm kullanıcı foo'yu X sunucusuna izin verilen erişim listesine eklemekti.

xhost si:localuser:foo

Ve öyleyse, daha sonra Firefox'u (ve diğer X uygulamalarını) sudove foo kullanıcısını kullanarak başlatabildim .

Arka plan : X Penceresinde, bir istemci / sunucu mimarisi var. Bir uygulamayı başlattığınızda, X sunucusu tarafından görüntülenmesi için yetki isteyin. Bir oturumu açtığınızda (grafiksel olarak oturum açarsanız), varsayılan olarak, sizin (kullanıcınız) sunucuyla iletişim kurmanıza ve uygulamaları görüntülemenize izin verilir. Siz belirtmedikçe, diğer kullanıcılar bu izne sahip değil. xhostizin listesini değiştirmek için kullanılan bir araçtır. siKural sunucu tarafı olduğunu gösterir ve yerel kullanıcı yetki fooekran uygulamalara. X Window bu konuda çok güçlü ve uzaktan DISPLAYdeğişkenleri ortam değişkeni ile oynayarak yerel olarak görüntüleyebilir ve xhost(ancak bunlarla sınırlı değil). Eski zamanlarda, insanlar yazdıklarındaxhost + ve herkesin X oturumunu kullanmasına izin verilmişse, şakalar için ekranlarında uygulama görüntülemek mümkündü; 10 yıl geçmiş).

Not: Bunu Firefox’u bir tür “hapishanede” başlatmak için yaptım (gelecekte pdf.js gibi bir güvenlik açığından kaçınmak için ). Ancak, Firefox'u sudo ile aramanın ses veya video donanımına erişmesine izin vermediğini çabucak öğrendim. Ancak, Firefox'u sudo aracılığıyla çağırırken video donanım ivmesini ve sesini nasıl etkinleştireceğinizi açık bir şekilde açıklayan bir adam var . Bu talimatlara sahip YMMV, örneğin hala ses reddedilmiş iznim var ancak video gayet iyi (Fedora 22'de SELinux ON ile test edildi).


1
Benim durumda fooidi root, yani ben çalıştırmak zorunda xhost si:localuser:rootUbuntu 17.10 üzerinde.
Karl Richter

xhost si:localhost<user>Komutu nereye eklersiniz ? Hiçbir kullanıcı oturum açmadıysa, kimsenin izin vermek için kullanabileceği bir X sunucusu yoktur.
cbcoutinho

@cbcoutinho Yukarıdaki kullanım durumu, birinin oturum açtığında ve aynı ana bilgisayardaki XWindow uygulamasını başka biri olarak çalıştırmak istediği durumdur. Kullanım durumunuzu açıklarsanız (çözmek istediğiniz problem nedir) o zaman size yardımcı olabilirim.
Huygens

@Huygens GPU ile donatılmış akışkanları simüle etmek için bir iş istasyonum var. Görselleştirmeleri , genellikle iş istasyonunun üzerine ParaViewkurulu bir programla yapıyorum vtk. ParaViewAyrıca, VNC kullanmak yerine uzaktan kumandadan yararlanmak istediğim ssh aracılığıyla güvenli bir başsız istemci / sunucu oluşturma modeli sunar. İş istasyonuna giriş yapıp çalıştırmadan xhostGPU’yu kullanamıyorum. Bu, makineyi uzaktan yeniden başlatamadığım ve hala GPU’ya erişemediğim anlamına geliyor.
cbcoutinho

1
@cbcoutinho X Window bir istemci sunucusu mimarisidir. Ssh ile bağlandığınızda, yerel iş istasyonunuz istemci X Penceresi olur. Xhost'u rlogin gibi güvenli olmayan protokollerle kullanabilirsiniz, ancak ssh kullanmazsınız. Ssh'a bunu sizin için yapması talimatını vermeniz gerekir. Ya ssh üzerinde -Xveya (daha iyi?) İşaretini kullanın -Y, doğru yönlendirmeyi yapacaktır. Elbette yerel C Sunucusuna ihtiyacınız var. Ancak GPU ve OpenGL ile render / compute'un nerede gerçekleştiğinden emin değilim, sunucuda değil, müşteri tarafında. Zor olabilir.
Huygens

10

Ya yapabilirsiniz

Eklenerek komut satırında kullanılacak ekranı belirtin. -display :0.0

veya

Ortam değişkenini root giriş komut dosyasında ayarlayın (.bashrc, .profile, .bash_profile ... 'dan biri).

export DISPLAY=:0.0

Ayarlanmış olup olmadığını kontrol edebilirsiniz,

$ env |grep DISPLAY
DISPLAY=:0.0

Ekranınızı tüm kullanıcılardan tüm kullanıcılar için normal kullanıcınız olarak açmak için aşağıdakileri yapabilirsiniz:

xhost +


1
xhost + sudo'ya girmeden önce geçici bir önlem olarak çalışıyor
Octopus

1
xhost +benim için de çalıştı, sadece bahsetmeyi unuttuklarını, altındaki terminalden değil, yetkili kullanıcının terminalinden çalıştırmamız gerektiğini söylediler sudo su.
Nyxee

1
bom gibi mükemmel bir iş
Adiii

3

Debian'da bulunduğunuz göz önüne alındığında, basit ve desteklenen çözüm, sudoX11 yetkilendirme kimlik bilgilerinizi kopyalamanız için düzenlemektir . tam olarak bu amaç pam_xauthiçin libpam-modulespakete dahil edilmiştir ; kullanmak için, sadece eklemeniz gerekir

session  optional  pam_xauth.so

sizin için /etc/pam.d/sudodosyanın. Siz de eklemeyi seçebilirsiniz su. Tüm bilgiler için pam_xauthelbette man sayfasına bakın .


2

Bana ne yardımcı oldu:

  1. Sen edebilirsiniz xauth generate :0 . trustedüzerinde useryan, hangi yeni üretecektirMIT-MAGIC-COOKIE-1
  2. Yeni yaratılan Anahtarın xAuthority` değişkeninin xauth list' askullanıcı andköküyle (they should be the same if youraynı dosyaya işaret ettiğini kontrol edin.

  3. Voila, rootherhangi bir X-Appterminalden erişecek , ancak geçici olarak.

Kalıcı yapmak için bkz. @Huygens'ın cevabı!


1

Alternatif çözüm :

Kök altında çalışan cron gibi hizmetler, mevcut x kullanıcısı root değilse, ekrana erişemez.

Sadece x'e root kullanıcısı eklememiz yeterli, giriş anında komut dosyasını başlangıç ​​betiği ile yapabilirsiniz

xhost local:root

Test amacıyla mevcut kullanıcının altındaki komuttan daha fazla çalıştırıp root script / job / service / ... komutunu yeniden başlatabiliriz.


Sadece merak ediyorum, neden bir cron aracılığıyla bir gui uygulaması çalıştırıyordunuz?
Ahtapot,

dağıtımımda sistem güvenliği sağlığını kontrol eden ve bir rapor yapan bir kök cron işi (msn) var ... bu yüzden bu raporu kontrol etmek için günlükleri bırakmak yerine, o iş çalıştırıldığında raporla ilgili bir açılır pencere gui olmasını tercih ederim
intika 24:18

BU benim için çalıştı
Marcus Vinicius Pompeu

0

sudoKomut ortam değişkenleri korumak için bir anahtar vardır.

 -E, --preserve-env            preserve user environment when running command

Böylece komutu -E düğmesiyle çalıştırabilirsiniz. Örnek:

sudo -E wireshark

Web tarayıcıları gibi gizlilik açısından kritik uygulamaları çalıştırmanız gerekmiyorsa, sudo ile -E anahtarı eklemekten daha iyi olursunuz. Chrome veya Firefox'u yalnızca -E anahtarı ekleyerek çalıştıramıyoruz . Çünkü birçok tarayıcı kullanıcı alanı ihlallerine karşı koruma sağlamıştır. @ huygens'in cevabı bu konuda görüş sahibi olabilir.

Not: -E anahtarının eklenmesi, kullanıcı ortamınız YAPMADIĞINIZ DISPLAY ve XAUTHORITY zaten doğru ayarlanmışsa yardımcı olmaz .


-1

bu komutu kullanın ve işe yarayacak

sudo cp /home/user/.Xauthority .Xauthority

2
Bu, cp: cannot stat ‘/home/user/.Xauthority’: No such file or directoryerişebildiğim 10+ Debian tabanlı makineden herhangi birini verecek .
Anthon,

Bu, küçük bir bağlam verir (örneğin, sessiz bir şekilde geçerli bir dizini beklersiniz) ve birden çok X11 örneğinde bunu yaparken sıkıntılar gibi yan etkilerden bahsetmiyorsunuz. Ben bu şekilde biraz sahte olduğunu düşünüyorum.
v6ak
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.