Cara mengatasi 'Tidak ada protokol yang ditentukan' untuk pengguna su


15

Saya mencoba menggunakan pengguna alternatif (non-admin) untuk menjalankan perangkat lunak grafis pada sistem saya. Pengguna alternatif ini telah diberi nama dan diberi UID dan GID untuk mencocokkan pengguna sistem jarak jauh dengan nama yang sama. UID adalah 500 jadi saya percaya itu membuat pengguna menjadi pengguna 'non-login'.

Mulai dari Ubuntu masuk ke akun utama saya, saya membuka terminal dan suke pengguna alternatif. Saya kemudian mencoba untuk mengeksekusi perintah untuk memulai aplikasi dan menerima 'Tidak ada protokol yang ditentukan'.

Apakah ini karena UID <1000, karena suatau karena non-admin pengguna? Bagaimana saya bisa membuat pengguna ini menjalankan aplikasi dengan GUI?

Jawaban:


15

Masalahnya tidak terjadi karena UID pengguna. 500 baik-baik saja sebagai UID, dan bahwa UID tidak menjadikannya pengguna 'non-login' kecuali di mata pengaturan default beberapa manajer tampilan.

Pesan kesalahan Tidak ada protokol yang ditentukan terdengar seperti pesan kesalahan khusus aplikasi, dan tidak membantu pada saat itu, tetapi saya akan menebak bahwa kesalahannya adalah aplikasi tidak dapat menghubungi tampilan X11 Anda karena tidak memiliki izin untuk melakukan jadi karena itu berjalan sebagai pengguna yang berbeda. Aplikasi memerlukan "kue ajaib" (token rahasia) untuk dapat berbicara dengan server X11 sehingga proses lain pada sistem yang berjalan di bawah pengguna lain tidak dapat mengganggu tampilan Anda, membuat windows, dan mengintip penekanan tombol Anda. Pengguna sistem lain tidak memiliki akses ke cookie ajaib ini karena izin ditetapkan sehingga hanya dapat diakses oleh pengguna yang memulai lingkungan desktop (yang sebagaimana mestinya).

Coba ini, jalankan sebagai pengguna awal Anda, untuk menyalin cookie X11 ke akun lain:

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

kemudian jalankan aplikasi Anda. Anda juga mungkin perlu mengeset XAUTHORITYdi shell itu juga. Perintah itu mengekstrak cookie ajaib ( xauth list) dari pengguna utama Anda dan menambahkannya ( xauth add) ke tempat pengguna lain bisa mendapatkannya.


Anehnya, menggunakan perintah yang dikutip Anda memberi 'su: harus dijalankan dari terminal'. Tapi itu adalah di terminal ...
J Collins

@JCollins mencoba xauth list >/tmp/xa.$$; su - <otheruser> -c "unset XAUTHORITY; xargs xauth add </tmp/xa.$$"; rm -f /tmp/xa.$$tetapi waspadai ada kondisi balapan yang mengerikan di sana.
roaima

@JCollins oops, ya, itu akan menjadi masalah jika suingin meminta kata sandi. Coba perintah baru ini.
Celada

@Celada, emas, membuat suguhan. Bisakah Anda mencoba merinci apa yang sedang dilakukan perintah itu dan bagaimana caranya? Dan mungkin menjelaskan mengapa inkarnasi asli tidak?
J Collins

1
@JCollins Anda harus mengulanginya setiap kali setelah Anda logout dan masuk karena cookie ajaib baru dihasilkan setiap kali. Itu normal, itu bagian dari model keamanan.
Celada

6

Saya kasus server tampilan baru waylandmasalahnya,

lakukan saja xhost + local:maka pengguna lain (mis. root) diizinkan untuk menjalankan Programms di sesi Anda, namun koneksi jaringan tidak akan diizinkan.

Jika Anda ingin mengizinkan klien dari host mana pun , Anda dapat menggunakan xhost +tanpa menentukan host apa pun. Namun ini tidak aman , akan lebih baik untuk menentukan host yang ingin Anda akses ke sesi Anda.


1
Dalam kasus saya xhost +sudah cukup
bahaya89

1
@ hazard89 saat ini berhasil, memungkinkan host mana pun untuk terhubung ke sesi Anda jika Anda tidak memiliki aturan firewall untuk mencegah akses jarak jauh (Tidak setiap distribusi memiliki aturan firewall yang menolak semua permintaan yang masuk misalnya ubuntu tidak memiliki aturan yang telah dikonfigurasi untuk mencegah akses ke server seperti samba atau apache yang mungkin ingin diinstal oleh pengguna) sehingga bagi pengguna linux baru ini bisa menjadi masalah. Secara pribadi saya akan membatasi akses hanya untuk berada di sisi save
MADforFUNandHappy

3

Misalkan Anda ingin secara brutal mendapatkan koneksi ke X ...

Mari kita asumsikan Anda sudah menjalankan perintah Anda di server (di mana X berjalan), jika tidak, jalankan terlebih dahulu dan kemudian gunakan 'ssh -X user @ server) dari klien sesudahnya;).

Mungkin ada beberapa cara untuk menjalankan perintah xauth, misalnya, Anda mungkin menggunakan 'sudo', tetapi itu mungkin kehilangan atau mengubah variabel lingkungan. Variabel lingkungan berikut perlu dipertahankan: DISPLAY dan XAUTHORITY. Untuk menguji apakah itu yang terjadi, Anda dapat menjalankan 'echo $ XAUTHORITY' dengan cara yang sama dengan Anda menjalankan perintah, tetapi pastikan Anda tidak memperluas variabel lingkungan sebelum menjalankan perintah itu. Sebagai contoh, coba: sudo bash -c 'echo "$ XAUTHORITY"' untuk melihat apa sebenarnya XAUTHORITY setelah Anda menjalankan sudo Anda (jika hilang Anda mungkin perlu menambahkan sesuatu ke file sudoers Anda, lihat di tempat lain).

Akhirnya, jalankan perintah berikut sebagai pengguna yang ingin Anda akses, di server:

xauth info

Ini akan menampilkan 'File otoritas' yang akan digunakan (/root/.Xauthority secara default, untuk root, atau sesuatu seperti /home/theuser/.Xauthority). Jika itu menunjukkan file .Xauthority yang benar maka Anda tidak perlu khawatir tentang variabel lingkungan XAUTHORITY sebenarnya (sebenarnya, saya tidak akan tahu kapan tidak, kecuali jika Anda ingin memanipulasi tempat non-standar file itu. ).

Hapus file itu (jika memang ada):

rm /root/.Xauthority

Ganti /root/.Xauthoritydengan file XAUTHORITY yang benar untuk kasus Anda.

Buat kembali, tetapi kosong (ini diperlukan untuk banyak perintah):

touch /root/.Xauthority

Pada titik ini Anda akan mendapatkan kesalahan protokol khusus , bahkan jika sebelumnya Anda mendapatkan MIT-MAGIC-COOKIE-1 yang tidak valid . Temukan file otoritas yang digunakan server X saat ini:

ps aux | grep Xorg

Ini harus menunjukkan sesuatu seperti:

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

Nama file setelah -authadalah apa yang Anda butuhkan dalam perintah selanjutnya. Jalankan ini sebagai root:

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

Itu mencantumkan kunci heksadesimal 32 digit. Misalnya outputnya bisa:

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

Gunakan itu untuk menghasilkan file .Xauthority Anda (sebagai pengguna yang perlu masuk lagi):

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

ganti 'c0eaf749aa252101a0f57d5087089db7' dengan apa yang dikembalikan oleh perintah daftar untuk Anda. Sekarang .Xauthority Anda seharusnya berukuran 51 byte dan Anda dapat terhubung ke server X (lagi).


Tidak ada utas, ini adalah situs tanya jawab, bukan forum
Anthon

2

Coba sesuatu seperti itu

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

sumber

Ps : jawaban yang diterima tidak berhasil untuk saya


1

Saya mengalami kesalahan ini "Tidak ada protokol yang ditentukan" ketika saya memulai instance Selenium 3.3.1 dari skrip pemula dan kemudian menggunakan driver Chrome di Selenium. Selenium berjalan sebagai pengguna yang sama dengan X11, dan variabel lingkungan shell DISPLAY diatur dengan benar. Yang menarik adalah bahwa kesalahan ini tidak terjadi ketika saya menggunakan driver Firefox. Mengatur variabel lingkungan shell XAUTHORITY di dalam skrip pemula untuk menunjuk ke nilai $ XAUTHORITY dari pengguna X11 aktif memperbaiki kesalahan driver Chrome.

Di samping catatan, kesalahan "Tidak ada protokol yang ditentukan" sepenuhnya dikubur oleh driver Chrome / Chrome dan tidak mudah ditemukan. Saya perhatikan bahwa Chrome terus membuat direktori dalam pola /tmp/.org.chromium.Chromium.*, tetapi mereka dengan cepat menghilang. Saya berhasil melihat bahwa mereka berisi file chrome_debug.logyang memiliki pesan "Tidak dapat membuka tampilan". Saya pikir ini agak aneh karena saya telah memverifikasi bahwa proses Selenium memiliki DISPLAY yang benar /proc/$pid/environdan memeriksa output stracepada proses Selenium lebih menyeluruh, yang mengungkapkan "Tidak ada protokol yang ditentukan" yang akhirnya membawa saya ke pertanyaan ini.

Kesalahan ini dapat direproduksi dengan membatalkan XAUTHORITY dan mencoba menjalankan beberapa klien X11. Sebagai contoh:

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

0

Ini sederhana. Masalahnya terjadi ketika Anda berada di root sate dan ingin menggunakan gksu Cukup keluar dari kondisi root dan coba lagi


0

Cukup ketik ini di terminal Anda xhost +SI:localuser:rootsetelah itu Anda ketik export DISPLAY=:0.0kemudian coba lagi


0

Dengan menggunakan petunjuk dalam jawaban yang diterima, saya dapat memecahkan masalah secara berbeda:

  1. Temukan file Xauth di akun yang berfungsi (Xauth1)
  2. Temukan file Xauth di akun yang tidak (Xauth2)
  3. Salin Xauth1 ke Xauth2
  4. Ubah izin Xauth2

Dalam kode:

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

Katakanlah Anda mencoba mengakses GUI sebagai user2 ( pengguna normal ), maka Anda perlu memuat UI instalasi sebagai user2 .

Coba ikuti ini:

Masuk sebagai root :

sudo su

Uji x server:

xclock

Jika Anda dapat melihat jam berjalan, itu bagus, sekarang coba jalankan ini:

xhost

Hasilnya harus seperti ini:

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

Sekarang, biarkan user2 mengakses xhost

xhost +SI:localuser:user2

sekarang coba masuk lagi ke user2 dan coba buka salah satu program GUI.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.