Su kullanıcısı için 'Protokol belirtilmedi' nasıl çözülür


15

Sistemimde grafik yazılımı yürütmek için alternatif bir kullanıcı (yönetici olmayan) kullanmaya çalışıyorum. Bu alternatif kullanıcı, aynı ada sahip bir uzak sistem kullanıcısıyla eşleşmesi için adlandırılmış ve bir UID ve GID verilmiştir. UID 500 yani kullanıcı 'oturum açma' kullanıcı yapar inanıyorum.

Ana hesabımda oturum açmış Ubuntu'dan başlayarak bir terminal açıyorum ve sualternatif kullanıcıya. Daha sonra uygulamayı başlatmak ve 'Belirtilen protokol yok' almak için komutu yürütmeye çalışıyorum.

Bunun nedeni su, kullanıcı yöneticisi olmayan veya kullanıcı kimliği olmayan <1000 nedeniyle UID mi? Bu kullanıcının uygulamayı bir GUI ile yürütmesini nasıl sağlayabilirim?

Yanıtlar:


15

Sorun olduğu değil , çünkü kullanıcının UID meydana gelen. 500, bir UID kadar iyidir ve bu UID, birkaç ekran yöneticisinin varsayılan ayarlarının gözü dışında, onu 'oturum açmamış' bir kullanıcı yapmaz.

Hata mesajı Hiçbir protokol belirtilen uygulamaya özgü bir hata mesajı ve yararsız bir hata gibi geliyor, ama hata yapmak için uygulama X11 ekranınız iletişim kuramıyor çünkü tahmin edeceğim farklı bir kullanıcı olarak çalıştığı için. X11 sunucusuyla konuşmak için uygulamaların "sihirli çerez" (gizli belirteç) olması gerekir, böylece diğer kullanıcılar altında çalışan sistemdeki diğer işlemler ekranınıza giremez, pencereler oluşturamaz ve tuş vuruşlarınızı gizleyemez. Diğer sistem kullanıcısının bu sihirli çereze erişimi yoktur, çünkü izinler yalnızca masaüstü ortamını başlatan kullanıcı tarafından erişilebilir olacak şekilde ayarlanmıştır (olması gerektiği gibi).

X11 çerezini diğer hesaba kopyalamak için orijinal kullanıcı olarak çalışan bunu deneyin:

su - <otheruser> -c "unset XAUTHORITY; xauth add $(xauth list)"

ardından uygulamanızı çalıştırın. Bu XAUTHORITYkabukta da ayarını kaldırmanız gerekebilir . Bu komut sihirli çerezi ( xauth list) ana kullanıcınızdan çıkarır ve xauth adddiğer kullanıcının alabileceği yere ( ) ekler .


Tuhaf bir şekilde, tırnak içine alınmış komutunuzu kullanarak 'su: bir terminalden çalıştırılmalıdır' verir. Ama bir ... bir terminalde
J Collins

@JCollins deniyor xauth list >/tmp/xa.$$; su - <otheruser> -c "unset XAUTHORITY; xargs xauth add </tmp/xa.$$"; rm -f /tmp/xa.$$ama orada korkunç bir yarış durumu olduğunu unutmayın.
roaima

@JCollins ayy, evet, subir şifre istemek bir sorun olurdu . Bu yeni komutu deneyin.
Celada

@Celada, altın, bir tedavi yaptı. Bu komutun ne yaptığını ve nasıl olduğunu ayrıntılı olarak inceleyebilir misiniz? Ve belki de orijinal enkarnasyonun neden olmadığını açıklayan?
J Collins

1
@JCollins, oturumu kapatıp oturum açtıktan sonra her seferinde yeniden yapmanız gerekecek, çünkü her seferinde yepyeni bir sihirli çerez üretiliyor. Bu normal, güvenlik modelinin bir parçası.
Celada

6

Benim durumum yeni ekran sunucusunun waylandsorun olmasıydı,

sadece xhost + local:diğer kullanıcıların (örneğin root) oturumunuzda Programları çalıştırmasına izin verilir, ancak ağ bağlantılarına izin verilmez.

Herhangi bir ana bilgisayardan istemcilere izin vermek istiyorsanız, herhangi bir ana bilgisayarxhost + belirtmeden kullanabilirsiniz . Ancak bu güvenli değildir , oturumunuza erişim vermek istediğiniz ana bilgisayarları belirtmeniz daha iyi olur.


1
Benim durumumda xhost +yeterli
danger89

1
@ danger89 çalışırken, uzaktan erişimi önlemek için güvenlik duvarı kuralınız yoksa herhangi bir ana bilgisayarın oturumunuza bağlanmasına izin verir (Her dağıtımda, gelen tüm istekleri reddeden güvenlik duvarı kuralları yoktur, örneğin ubuntu, sunuculara erişimi önlemek için önceden yapılandırılmış kurallara sahip değildir samba veya kullanıcının yüklemek isteyebileceği bir apache) yeni linux kullanıcıları için bu bir sorun haline gelebilir. Şahsen ben sadece tasarruf tarafında olmak için erişimi sınırlamak istiyorum
MADforFUNandHappy

3

Böyle bir şey dene

$ export LOGIN_USER="Math"
$ su - $LOGIN_USER
$ sudo xhost local:$LOGIN_USER &>/dev/null

kaynak

Ps : kabul edilen cevap benim için işe yaramadı


3

Kaba kuvvet uygulamak istediğinizi varsayalım ...

Komutlarınızı sunucuda (X'in çalıştığı yerde) zaten çalıştırdığınızı varsayalım, aksi takdirde bunu önce çalışmasını sağlayın ve daha sonra istemciden 'ssh -X user @ server'ı kullanın;).

Xauth komutlarını çalıştırmanın birkaç yolu olabilir, örneğin 'sudo' kullanıyor olabilirsiniz, ancak bu ortam değişkenlerini kaybedebilir veya değiştirebilir. Aşağıdaki ortam değişkenlerinin korunması gerekir: EKRAN ve XAUTHORITY. Durumun böyle olup olmadığını sınamak için 'echo $ XAUTHORITY' komutlarını çalıştırdığınız şekilde çalıştırabilirsiniz, ancak bu komutları çalıştırmadan önce ortam değişkenlerini genişletmediğinizden emin olun. Örneğin, sudo bash'nizi çalıştırdıktan sonra XAUTHORITY'nin gerçekte ne olduğunu görmek için şunu deneyin: sudo bash -c 'echo "$ XAUTHORITY"' (eğer kaybolursa sudoers dosyanıza bir şeyler eklemeniz gerekebilir), başka bir yere bakın).

Sonunda, sunucuda erişmek istediğiniz kullanıcı olarak aşağıdaki komutu çalıştırın:

xauth info

Bu, kullanılacak 'Yetki dosyasını' gösterecektir (varsayılan olarak /root/.Xauthority, kök için veya /home/theuser/.Xauthority gibi). Doğru .Xauthority dosyasını gösterirse, o zaman XAUTHORITY ortam değişkeni hakkında endişelenmenize gerek yoktur (aslında, o dosyanın standart olmayan bir yerini değiştirmek istemiyorsanız hariç, ne zaman olacağını bilmezdim ).

Bu dosyayı kaldırın (varsa):

rm /root/.Xauthority

/root/.XauthorityDurumunuz için doğru XAUTHORITY dosyasıyla değiştirin .

Yeniden oluşturun, ancak boş (bu, birçok komut için gereklidir):

touch /root/.Xauthority

Bu noktada , daha önce Geçersiz MIT-MAGIC-COOKIE-1 almış olsanız bile, Protokol belirtilmedi hatası alırsınız . X sunucusunun şu anda kullanmakta olduğu yetki dosyasını bulun:

ps aux | grep Xorg

Bu şöyle bir şey göstermelidir:

root 1153 0.0 1.0 149560 44464 tty7 Ss+ dec02 0:00 /usr/lib/xorg/Xorg -nolisten tcp -auth /var/run/sddm/{ef18c483-7891-4e82-80ef-2c8f9bd79711} -background none -noreset -displayfd 17 vt7

Dosya adı -auth, sonraki komutta gerek duyduğunuz addır . Bunu root olarak çalıştır:

sudo xauth -f '/var/run/sddm/{ef18c483-7891-4e82-80ef-2c8f9bd79711}' list

32 basamaklı bir onaltılık anahtar listelenir. Örneğin çıktı:

hostname/unix:0 MIT-MAGIC-COOKIE-1 c0eaf749aa252101a0f57d5087089db7

Bunu, .Xauthority dosyanızı oluşturmak için kullanın (tekrar oturum açması gereken kullanıcı olarak):

xauth add $DISPLAY MIT-MAGIC-COOKIE-1 c0eaf749aa252101a0f57d5087089db7

'c0eaf749aa252101a0f57d5087089db7' yerine list komutunun sizin için döndürdüğü ifadeyi yazın. Şimdi .Xauthority'niz 51 bayt boyutunda olmalı ve X sunucusuna bağlanabilirsiniz (tekrar).


Konu yok, bu bir soru-cevap sitesi, bir forum değil
Anthon

1

Ben bir uptart komut dosyasından Selenium 3.3.1 bir örneğini başlattı ve sonra Selenium Chrome sürücüsü kullandığımda bu hata "Protokol belirtilmedi" vardı. Selenyum, X11 ile aynı kullanıcı olarak çalıştı ve DISPLAY kabuk ortamı değişkeni doğru ayarlandı. İlginç olan, Firefox sürücüsünü kullandığımda bu hatanın gerçekleşmemesidir. XAUTHORITY kabuk ortam değişkenini, aktif X11 kullanıcısının $ XAUTHORITY değerini gösterecek şekilde uptart komut dosyasının içindeki Chrome sürücüsünün hatasını düzeltti.

Bir yan notta, "Hiçbir protokol belirtilmedi" hatası Chrome / Chrome sürücüsü tarafından iyice gömüldü ve hiçbir şekilde kolay bulunmadı. Chrome'un deseninde dizin oluşturmaya devam ettiğini fark ettim /tmp/.org.chromium.Chromium.*, ancak hızla kayboluyorlardı. Ben chrome_debug.log"Ekran açılamıyor" mesajı olan bir dosya içerdiğini fark başardı . Selenium sürecinin doğru EKRAN'a sahip olduğunu doğruladığım ve Selenyum sürecinin /proc/$pid/environçıktısını stracedaha ayrıntılı bir şekilde incelediğim için bunun oldukça garip olduğunu düşündüm, bu da beni sonunda bu soruya yönlendiren "Hiçbir protokol belirtilmedi" ortaya koydu.

Bu hata, XAUTHORITY ayarının kaldırılması ve bazı X11 istemcilerinin çalıştırılmaya çalışılması ile çoğaltılabilir. Örneğin:

$ XAUTHORITY= xeyes
No protocol specified
Error: Can't open display: :0.0

0

Bu basitti. Sorun kök doyurmak olan ve kullanmak istediğinizde olur gksu Sadece çıkmak kök durumunu ve yeniden deneyin


0

Bunu xhost +SI:localuser:rootyazdıktan sonra terminalinize yazın ve export DISPLAY=:0.0tekrar deneyin


0

Kabul edilen cevaplarda ipuçlarını kullanarak sorunu farklı şekilde çözebildim:

  1. Çalışan hesapta Xauth dosyasını bulun (Xauth1)
  2. Hesapta olmayan Xauth dosyasını bulun (Xauth2)
  3. Xauth1'i Xauth2'ye kopyala
  4. Xauth2 izinlerini değiştirme

Kodda:

root@45c4933a8f1a:~# xauth info
Authority file:       /headless/.Xauthority
<snip>
root@45c4933a8f1a:~# su OtherUser
OtherUser@45c4933a8f1a:/headless$ xauth info
Authority file:       /home/OtherUser/.Xauthority
<snip>
OtherUser@45c4933a8f1a:/headless$ exit
exit
root@45c4933a8f1a:~# cp /headless/.Xauthority /home/OtherUser/.Xauthority 
root@45c4933a8f1a:~# chown OtherUser:OtherUser /home/OtherUser/.Xauthority
root@45c4933a8f1a:~# su OtherUser

0

Diyelim ki GUI'ye user2 ( normal kullanıcı ) olarak erişmeye çalışıyorsunuz , o zaman kurulum kullanıcı arayüzünü user2 olarak yüklemeniz gerekiyor .

Bunu takip etmeye çalışın:

Root olarak giriş yap :

sudo su

X sunucusunu test edin:

xclock

Bir saatin çalıştığını görebiliyorsanız, bu işe yarar, şimdi şunu deneyin:

xhost

Sonuç şöyle olmalıdır:

xhost SI:localuser:tri
# tri is my user name

Şimdi user2'nin xhost'a erişmesine izin verin

xhost +SI:localuser:user2

şimdi user2'ye tekrar giriş yapmayı ve herhangi bir GUI programını açmayı deneyin.

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.