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 glxgears
dari akun pengguna. Hanya setelah saya melakukan sudo -i
itu masalah muncul. Ini terjadi untuk aplikasi GUI yang saya coba jalankan. Saya pikir ini mungkin terkait dengan X11, tapi saya tidak yakin.
Jawaban:
Mengakses server X memerlukan dua hal:
$DISPLAY
variabel menunjuk ke layar yang benar (biasanya:0
)Informasi otentikasi dapat ditentukan secara eksplisit melalui
$XAUTHORITY
, dan standarnya adalah~/.Xauthority
sebaliknya.Jika
$DISPLAY
dan$XAUTHORITY
diatur untuk pengguna Anda,sudo
akan 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
$XAUTHORITY
biasanya tidak diatur secara eksplisit. Cukup tambahkanuntuk Anda
.bashrc
atau secara eksplisit katakanXAUTHORITY=~/.Xauthority sudo ...
dan semuanya harus bekerja.Anda juga dapat menggunakan
xauth list
untuk memeriksa apakah informasi otentikasi yang tepat tersedia.sumber
xauth info
menunjukkan path ke file authorityxhost +
memperbaiki masalah sayaxhost +
sepenuhnya menonaktifkan otentikasi dan memungkinkan semua orang untuk mengakses semua aplikasi di layar Anda ...sudo -i
bukansudo su -
.Saya memiliki pertanyaan yang sama seperti Anda tetapi untuk pengguna normal. Katakanlah saya ingin memulai firefox menggunakan foo akun pengguna. Saya masuk sebagai bilah:
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.
Dan hanya itu, saya kemudian dapat meluncurkan Firefox (dan aplikasi X lainnya) menggunakan
sudo
dan 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.
xhost
adalah alat untuk memanipulasi daftar izin. Yangsi
menunjukkan bahwa aturannya adalah sisi server dan memberi otorisasi pengguna lokalfoo
untuk menampilkan aplikasi. X Window sangat kuat dalam hal ini dan Anda dapat menampilkan aplikasi jarak jauh secara lokal dengan bermain denganDISPLAY
variabel lingkungan danxhost
(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).
sumber
foo
adalahroot
, yaitu saya harus menjalankanxhost si:localuser:root
Ubuntu 17.10.xhost si:localhost<user>
perintah? Jika tidak ada pengguna yang masuk, maka tidak ada yang memiliki server X yang tersedia untuk memberikan izin.ParaView
, program yang dibangunvtk
, biasanya di workstation itu sendiri.ParaView
juga 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 eksekusixhost
, saya tidak bisa memanfaatkan GPU. Itu berarti bahwa saya tidak dapat mem-boot ulang mesin dari jarak jauh dan masih memiliki akses ke GPU.-X
atau (lebih baik?)-Y
Di 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.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,
Untuk membuka tampilan Anda untuk semua pengguna dari semua host sebagai pengguna normal, Anda dapat melakukan ini dengan:
xhost +
sumber
xhost +
bekerja untuk saya juga, hanya bahwa mereka lupa menyebutkan kita harus menjalankannya dari terminal pengguna yang berwenang, bukan dari terminal di bawahsudo su
.Karena Anda menggunakan Debian, solusi sederhana dan didukung adalah mengatur untuk
sudo
menyalin kredensial otorisasi X11 Anda.pam_xauth
termasuk dalamlibpam-modules
paket untuk tujuan ini; untuk menggunakannya, Anda hanya perlu menambahkanke
/etc/pam.d/sudo
file Anda . Anda juga dapat memilih untuk menambahkannyasu
. Untuk informasi lengkap, lihatpam_xauth
halaman manual, tentu saja.sumber
Apa yang membantu saya:
xauth generate :0 . trusted
diuser
samping, yang akan menghasilkan yang baruMIT-MAGIC-COOKIE-1
Periksa kunci yang baru dibuat dengan variabel root xAuthority`
xauth list' as
pengguna menunjuk ke file yang sama.and
(they should be the same if your
Voila,
root
akan mengaksesX-App
dari terminal apa saja , tetapi hanya sementara.Untuk membuatnya permanen, lihat jawaban @Huygens '!
sumber
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
Untuk tujuan pengujian, kita hanya dapat menjalankan dari perintah di bawah pengguna saat ini dan meluncurkan kembali script root / pekerjaan / layanan / ...
sumber
The
sudo
perintah memiliki saklar untuk melestarikan variabel lingkungan.Sehingga Anda dapat menjalankan perintah dengan -E switch. Contoh:
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
danXAUTHORITY
sudah diatur dengan benar .sumber
gunakan perintah ini dan itu akan berhasil
sumber
cp: cannot stat ‘/home/user/.Xauthority’: No such file or directory
pada salah satu dari 10+ mesin berbasis Debian yang saya akses.