Mengapa saya tidak bisa menjalankan aplikasi GUI dari 'root': “Tidak ada protokol yang ditentukan”?

39

Saya menginstal debian ke komputer saya tadi malam. Sekarang, saya tidak mengerti mengapa saya tidak bisa menjalankan aplikasi GUI dari terminal saat dijalankan sebagai root.

Sebagai contoh:

sudo -i
glxgears

Menghasilkan output berikut:

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

Tetapi ketika saya pertama kali membuka terminal saya bisa lari glxgearsdari akun pengguna. Hanya setelah saya melakukan sudo -iitu masalah muncul. Ini terjadi untuk aplikasi GUI yang saya coba jalankan. Saya pikir ini mungkin terkait dengan X11, tapi saya tidak yakin.

Gurita
sumber
1
stackoverflow.com/a/20612084 ini berfungsi dengan baik untuk saya.
Tentang Wayland, untuk berjaga-jaga: Arch Wiki , "sudo dengan aplikasi grafis tidak berfungsi di wayland" .
Alexey

Jawaban:

39

Mengakses server X memerlukan dua hal:

  • The $DISPLAYvariabel menunjuk ke layar yang benar (biasanya :0)
  • Informasi otentikasi yang tepat

Informasi otentikasi dapat ditentukan secara eksplisit melalui $XAUTHORITY, dan standarnya adalah ~/.Xauthoritysebaliknya.

Jika $DISPLAYdan $XAUTHORITYdiatur untuk pengguna Anda, sudoakan mengaturnya untuk shell baru juga, dan semuanya akan berfungsi dengan baik.

Jika tidak diatur, mereka mungkin akan default ke nilai yang salah dan Anda tidak dapat memulai dan X aplikasi.

Dalam Debian $XAUTHORITYbiasanya tidak diatur secara eksplisit. Cukup tambahkan

export XAUTHORITY=~/.Xauthority

untuk Anda .bashrcatau secara eksplisit katakan XAUTHORITY=~/.Xauthority sudo ...dan semuanya harus bekerja.

Anda juga dapat menggunakan xauth listuntuk memeriksa apakah informasi otentikasi yang tepat tersedia.

michas
sumber
1
xauth infomenunjukkan path ke file authority
Tomas Tomecek
1
xhost +memperbaiki masalah saya
hazard89
3
Ketahuilah bahwa xhost +sepenuhnya menonaktifkan otentikasi dan memungkinkan semua orang untuk mengakses semua aplikasi di layar Anda ...
michas
1
untuk debian, apakah saya mengetikkan ekspor XAUTHORITY sebagai root? karena tidak berfungsi pada deb10? Saya masuk dengan sudo su
marinara
@marinara gunakan sudo -ibukan sudo su -.
michas
24

Saya memiliki pertanyaan yang sama seperti Anda tetapi untuk pengguna normal. Katakanlah saya ingin memulai firefox menggunakan foo akun pengguna. Saya masuk sebagai bilah:

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

Sayangnya perintah itu gagal dengan kesalahan yang sama seperti dalam pertanyaan (yaitu tidak ada protokol yang ditentukan & tidak dapat membuka tampilan)

Solusi saya adalah dengan hanya menambahkan foo pengguna ke daftar akses resmi ke server X.

xhost si:localuser:foo

Dan hanya itu, saya kemudian dapat meluncurkan Firefox (dan aplikasi X lainnya) menggunakan sudodan foo pengguna.

Latar Belakang : Di X Window, ada arsitektur klien / server. Ketika Anda meluncurkan aplikasi, Anda meminta otorisasi X server untuk menampilkannya. Secara default setelah Anda membuka sesi (Anda login secara grafis), Anda (pengguna Anda) jelas diizinkan untuk berkomunikasi dengan server dan menampilkan aplikasi. Pengguna lain tidak memiliki izin ini kecuali Anda menentukannya. xhostadalah alat untuk memanipulasi daftar izin. Yang simenunjukkan bahwa aturannya adalah sisi server dan memberi otorisasi pengguna lokal foountuk menampilkan aplikasi. X Window sangat kuat dalam hal ini dan Anda dapat menampilkan aplikasi jarak jauh secara lokal dengan bermain dengan DISPLAYvariabel lingkungan dan xhost(tetapi tidak terbatas pada mereka). Di masa lalu, saat orang mengetikxhost + dan secara implisit memungkinkan semua orang untuk menggunakan sesi X mereka, adalah mungkin untuk menampilkan aplikasi pada layar mereka untuk lelucon ;-) tidak begitu banyak saat ini karena orang semakin kurang menggunakan arsitektur klien / server X Window (setidaknya untuk apa yang saya amati di 10 tahun terakhir).

PS: Saya melakukan ini untuk meluncurkan Firefox dalam semacam "penjara" (untuk menghindari kerentanan seperti untuk pdf.js di masa depan). Tetapi saya segera mengetahui bahwa memanggil Firefox melalui sudo tidak akan memungkinkannya untuk mengakses audio atau perangkat keras video. Tetapi ada satu orang yang menjelaskan dengan jelas bagaimana cara mengaktifkan akselerasi perangkat keras video dan audio saat memanggil Firefox melalui sudo . YMMV dengan instruksi ini, misalnya saya masih memiliki izin yang ditolak dengan audio tetapi video baik-baik saja (diuji pada Fedora 22 dengan SELinux ON).

Huygens
sumber
1
Dalam kasus saya fooadalah root, yaitu saya harus menjalankan xhost si:localuser:rootUbuntu 17.10.
Karl Richter
Di mana Anda menambahkan xhost si:localhost<user>perintah? Jika tidak ada pengguna yang masuk, maka tidak ada yang memiliki server X yang tersedia untuk memberikan izin.
cbcoutinho
@cbcoutinho Case use di atas adalah ketika seseorang masuk dan ingin menjalankan aplikasi XWindow seperti orang lain di host yang sama. Jika Anda menjelaskan kasus penggunaan Anda (masalah apa yang ingin Anda selesaikan) maka saya berpotensi membantu Anda.
Huygens
@ Huygens Saya memiliki workstation untuk mensimulasikan cairan yang juga dilengkapi dengan GPU. Saya membuat visualisasi dengan ParaView, program yang dibangun vtk, biasanya di workstation itu sendiri. ParaViewjuga menyediakan model rendering klien / server tanpa kepala yang aman melalui ssh, yang ingin saya manfaatkan dari jarak jauh alih-alih menggunakan VNC. Tanpa masuk ke workstation dan eksekusi xhost, saya tidak bisa memanfaatkan GPU. Itu berarti bahwa saya tidak dapat mem-boot ulang mesin dari jarak jauh dan masih memiliki akses ke GPU.
cbcoutinho
1
@cbcoutinho X Window adalah arsitektur server klien. Ketika Anda terhubung melalui ssh, workstation lokal Anda menjadi klien X Window. Anda bisa menggunakan xhost dengan protokol tidak aman seperti rlogin tetapi tidak ssh. Anda perlu menginstruksikan ssh untuk melakukannya untuk Anda. Baik menggunakan bendera -Xatau (lebih baik?) -YDi ssh, itu akan melakukan pengalihan yang tepat. Tentu saja Anda kemudian memerlukan Server C lokal. Namun dengan GPU dan OpenGL, saya tidak yakin di mana rendering / komputasi terjadi mungkin di sisi klien, bukan di server. Bisa jadi rumit.
Huygens
10

Anda juga bisa

Tentukan tampilan yang akan digunakan pada baris perintah, dengan menambahkan -display :0.0

atau

Setel variabel lingkungan di skrip login root (salah satunya .bashrc, .profile, .bash_profile ...).

export DISPLAY=:0.0

Anda dapat memeriksa apakah sudah diatur,

$ env |grep DISPLAY
DISPLAY=:0.0

Untuk membuka tampilan Anda untuk semua pengguna dari semua host sebagai pengguna normal, Anda dapat melakukan ini dengan:

xhost +

X Tian
sumber
1
xhost + berfungsi sebagai tindakan sementara sebelum masuk sebagai sudo
Octopus
1
xhost +bekerja untuk saya juga, hanya bahwa mereka lupa menyebutkan kita harus menjalankannya dari terminal pengguna yang berwenang, bukan dari terminal di bawah sudo su.
nyxee
1
pekerjaan sempurna seperti boom
Adiii
3

Karena Anda menggunakan Debian, solusi sederhana dan didukung adalah mengatur untuk sudomenyalin kredensial otorisasi X11 Anda. pam_xauthtermasuk dalam libpam-modulespaket untuk tujuan ini; untuk menggunakannya, Anda hanya perlu menambahkan

session  optional  pam_xauth.so

ke /etc/pam.d/sudofile Anda . Anda juga dapat memilih untuk menambahkannya su. Untuk informasi lengkap, lihat pam_xauthhalaman manual, tentu saja.

Toby Speight
sumber
2

Apa yang membantu saya:

  1. Anda dapat xauth generate :0 . trusteddi usersamping, yang akan menghasilkan yang baruMIT-MAGIC-COOKIE-1
  2. Periksa kunci yang baru dibuat dengan variabel root xAuthority` xauth list' aspengguna menunjuk ke file yang sama.and(they should be the same if your

  3. Voila, rootakan mengakses X-Appdari terminal apa saja , tetapi hanya sementara.

Untuk membuatnya permanen, lihat jawaban @Huygens '!

Timo
sumber
1

Solusi alternatif :

Layanan seperti cron yang berjalan di bawah root tidak memiliki akses untuk ditampilkan jika pengguna x saat ini tidak root.

Kami hanya perlu menambahkan pengguna root ke x, Anda dapat melakukannya pada saat login dengan skrip startup

xhost local:root

Untuk tujuan pengujian, kita hanya dapat menjalankan dari perintah di bawah pengguna saat ini dan meluncurkan kembali script root / pekerjaan / layanan / ...

intika
sumber
Hanya ingin tahu, mengapa Anda menjalankan aplikasi gui melalui cron?
Octopus
di distro saya, saya memiliki root cron job (msec) yang memeriksa kesehatan keamanan sistem dan membuat laporan ... jadi daripada pergi ke log untuk memeriksa laporan itu saya lebih suka memiliki popup gui dengan laporan ketika pekerjaan itu dijalankan
intika
INI bekerja untuk saya
Marcus Vinicius Pompeu
0

The sudoperintah memiliki saklar untuk melestarikan variabel lingkungan.

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

Sehingga Anda dapat menjalankan perintah dengan -E switch. Contoh:

sudo -E wireshark

Jika Anda tidak perlu menjalankan aplikasi penting privasi seperti browser web, Anda akan lebih baik menambahkan saklar -E dengan sudo. Kami tidak dapat menjalankan Chrome atau Firefox hanya dengan menambahkan -E switch. Karena banyak browser telah menerapkan perlindungan terhadap pelanggaran ruang pengguna. @ Huygens jawaban mungkin memiliki wawasan mengenai hal ini.

Catatan: Menambahkan saklar -E tidak akan membantu jika lingkungan pengguna Anda TIDAK memiliki DISPLAY dan XAUTHORITY sudah diatur dengan benar .

shan
sumber
-1

gunakan perintah ini dan itu akan berhasil

sudo cp /home/user/.Xauthority .Xauthority
pengguna187508
sumber
2
Ini akan memberikan cp: cannot stat ‘/home/user/.Xauthority’: No such file or directorypada salah satu dari 10+ mesin berbasis Debian yang saya akses.
Anthon
Ini memberikan sedikit konteks (misalnya, Anda diam-diam mengharapkan beberapa direktori saat ini) dan Anda tidak menyebutkan efek samping seperti masalah ketika melakukannya dalam beberapa kejadian X11. Saya pikir cara ini agak sedikit berantakan.
v6ak