Apa itu XDG_RUNTIME_DIR?

13

Ketika saya mencoba untuk membuka Evince dari baris perintah, itu memberi saya kesalahan

neo@Muhammad:~$ sudo evince

No protocol specified

** (evince:4164): WARNING **: Could not open X display
No protocol specified
error: XDG_RUNTIME_DIR not set in the environment.
Cannot parse arguments: Cannot open display:

Bagaimana cara mengatasi masalah ini?

Muhammad Iliyas
sumber
1
Ceritakan lebih lanjut tentang sistem operasi Anda.
DK Bose

Jawaban:

27

Hal pertama yang pertama: XDG_RUNTIME_DIR

Untuk menjawab pertanyaan pertama Anda, "Apa itu XDG_RUNTIME_DIR?" , ini adalah variabel lingkungan yang diatur secara otomatis ketika Anda masuk. Ini memberitahu program apa pun yang Anda jalankan di mana menemukan direktori khusus pengguna di mana ia dapat menyimpan file sementara kecil. Catatan yang XDG_RUNTIME_DIRditetapkan oleh pam_systemd(8) , sehingga tidak benar-benar terkait dengan X (menjalankan program secara grafis), yang merupakan masalah yang tampaknya Anda alami.

Cara mengatasi masalah

Pertanyaan kedua Anda, "Bagaimana cara mengatasi masalah ini?" adalah yang sangat bagus. Itu berarti Anda tertarik tidak hanya apa yang memperbaiki, tapi juga bagaimana untuk mencari tahu sendiri. Untuk memulai, lihat pesan kesalahan pertama terlebih dahulu. Secara khusus, mencari No protocol specifiedatau WARNING **: Could not open X display, akan menunjukkan kepada Anda bahwa masalahnya ada pada X (juga disebut The X Windowing System ) yang merupakan bagaimana program grafis ditampilkan di layar Anda. Mengetahui hal itu seharusnya memunculkan banyak pertanyaan pemecahan masalah dalam pikiran Anda.

X TAMPILAN

Mungkin pertanyaan Anda selanjutnya adalah, "tampilan X" apa yang tidak bisa dibuka oleh siapa pun ? "Tampilan" adalah alamat untuk layar Anda. [*] Setiap program yang ingin menulis ke layar Anda harus mengetahui alamatnya. Anda dapat melihat apa tampilan X Anda dengan memeriksa variabel lingkungan DISPLAY:

echo $DISPLAY

Dan Anda dapat memeriksa apa yang sudomenurut DISPLAY Anda dengan mengetik:

sudo -s
echo $DISPLAY
exit

Jika tidak menunjukkan apa-apa, maka itu masalahnya. (Lihat perbaikan di bawah).

XAUTHORITY

Tapi, bagaimana jika itu bukan masalah dan DISPLAYdiatur dengan benar sudo? Maka Anda mungkin bertanya-tanya, apakah X memiliki semacam izin yang mencegah pengguna lain menulis di layar saya? Jika Anda berpikir demikian, Anda akan benar, X memiliki dua metode otorisasi utama: xauthdan xhost. Yang paling umum digunakan saat ini adalah xauth(1) yang menggunakan XAUTHORITYvariabel lingkungan. Sekali lagi, mari kita periksa apakah sudah diatur dengan benar sudo:

echo $XAUTHORITY
sudo -s
echo $XAUTHORITY
exit

Jika XAUTHORITYmenunjuk ke sebuah file di direktori home Anda untuk Anda, tetapi itu kosong ketika Anda menjalankan sudo, maka itulah masalahnya.

FIX: Simpan Variabel Lingkungan

Jadi, apa masalahnya? Jika variabel lingkungan DISPLAYatau XAUTHORITYtidak diselamatkan di seluruh sudo, Anda dapat memberitahu sudo(8) untuk melestarikan lingkungan dengan menggunakan -Eopsi, seperti:

sudo -E evince

Cara yang lebih baik: env_keep

Anda mungkin bertanya, Tunggu, jika -Emembuat semuanya berfungsi secara ajaib, lalu mengapa itu bukan default untuk sudo? Jawabannya adalah bahaya keamanan potensial. Variabel lingkungan memengaruhi cara kerja program dan Anda tidak ingin semuanya diekspor dari akun pengguna ke root. Cara "benar" untuk melakukannya adalah dengan menambahkan baris Defaults env_keep += "DISPLAY XAUTHORITY"ke file sudoers(5) menggunakan visudo(8) . Anda dapat memeriksa variabel lingkungan yang dipertahankan oleh sudo dengan menjalankan:

sudo sudo -V

(Ya, Anda mengetik sudodua kali). Saya sarankan meletakkan baris tidak di file sudoers default ( /etc/sudoers), tetapi dalam file lokal yang tidak akan ditimpa ketika Anda memutakhirkan sistem Anda. Anda dapat melakukannya seperti itu:

sudo visudo -f /etc/sudoers.d/local 

Tapi tunggu, bagaimana jika tidak ada yang bekerja di atas?

Saya pikir ini adalah jawaban yang cukup menyeluruh, tetapi jika Anda masih mengalami masalah, ada satu hal lagi yang saya sarankan. Anda dapat menggunakan xhost(1) untuk memberikan akses ke pengguna tertentu pada host lokal (mesin Anda) seperti itu,

xhost si:localuser:root

Dalam hal ini, kami menetapkan rootsebagai nama pengguna, karena itulah akun yang sudomenjalankan program sebagai.


[*] : T: Saya hanya punya satu layar, jadi mengapa tampilan X perlu "alamat"? A: Itu karena X dapat bekerja tidak hanya pada mesin Anda, tetapi melalui internet. Dengan X , mudah menjalankan program di mesin Anda yang muncul di host internet lain dan program di host lain yang muncul di layar Anda (dengan asumsi Anda memberi mereka izin).

hackerb9
sumber
Terima kasih atas jawaban yang terperinci. Saya yakin setidaknya ada sesuatu yang baru dalam jawaban Anda untuk setiap pengguna. (Bagi saya: cara memberikan akses ke X ke pengguna tertentu, yang lebih baik daripada menerbitkan xhost +untuk memungkinkan akses universal.)
drumfire
3

XDG_RUNTIME_DIRadalah variabel lingkungan yang diatur dalam konteks X Windows Anda, sehingga program dapat menemukan sesuatu. Anda ( neo) telah mengatur konteks grafik.

Dengan mencoba menjalankan evinceseperti root, Anda telah memasuki kondisi di mana pengguna ( root) mencoba mengakses neotampilan pengguna lain ( ). Ini dianggap sebagai Hal Buruk.

Jika Anda memutuskan Anda HARUS menjalankan editor grafis sebagai root, baca man gksudo dan manfaatkan gksudo.

waltinator
sumber
komentar yang menarik. Apakah Anda kebetulan tahu bagaimana saya bisa melakukan hal seperti ini? journalctl -b -p err | wl-copyitu melaporkan Failed to connect to a Wayland serveryang masuk akal, tetapi terdengar bodoh dari POV Pengguna.
mh-cbon