Menjalankan aplikasi GUI sebagai pengguna (non-root) lainnya

34

Katakanlah saya punya 2 akun pengguna user1dan user2. Ketika saya login sebagai user1, dan kemudian beralih user2menggunakan su, saya bisa menjalankan program command-line, tetapi program GUI gagal.

Contoh:

user1@laptop:~$ su - user2
user2@laptop:~$ leafpad ~/somefile.txt
No protocol specified
leafpad: Cannot open display: 

Jadi bagaimana saya bisa menjalankan aplikasi GUI?

sashoalm
sumber
Salah satu alasan utama, saya telah menemukan, bahwa ini gagal adalah karena $XAUTHORITYmasih diatur ke user1's ~/.Xauthority, yang programnya, saya kira, akan mencoba membaca, dan gagal karena file itu biasanya memiliki mode 0600 ( -rw-------), yang berarti tidak tersedia untuk dibaca oleh siapa pun di grup "lain", yang mencakup pengguna2. Artinya jika Anda chmod o+r ~/.Xauthority(sebagai pengguna1), Anda akan meretas masalah ini. Saya menulis naskah yang menunjukkan ini.
Braden Best

Jawaban:

42

su vs su -

Saat menjadi pengguna lain yang biasanya ingin Anda gunakan su - user2. Tanda hubung akan memaksa user2 .bash_profileuntuk mendapatkan sumber.

xhost

Selain itu, Anda harus memberi pengguna akses ke layar Anda. Ini diatur oleh X. Anda dapat menggunakan perintah xhost +untuk mengizinkan izin pengguna lain untuk menampilkan GUI ke desktop pengguna1.

CATATAN: Saat menjalankan, xhost +Anda ingin menjalankan ini saat masih dalam shell milik pengguna1.

$ DISPLAY

Ketika Anda menjadi user2 Anda mungkin perlu mengatur variabel lingkungan $DISPLAY.

$ export DISPLAY=:0.0
slm
sumber
1
xhost +user2masih memberi saya kesalahan ini - xhost: bad hostname "user2". Saya googled beberapa, dan sepertinya saya perlu melakukan xhost +user2@laptopatau xhost +user2@localhost, tidak yakin yang mana. Lalu katanya xhost +user2@localhost being added to access control list.
sashoalm
1
Tetapi bahkan setelah menambahkan pengguna dengan xhost, dan menentukan export DISPLAY=:0.0, menjalankan leafpadmasih memberi saya No protocol specified leafpad: Cannot open display:, dan gagal dijalankan. Saya menemukan tautan ini di linuxquestions.org/questions/linux-newbie-8/… , yang mengatakan bahwa ada beberapa cookie ajaib dan xauth. Sudahkah Anda menguji hal-hal itu berfungsi pada komputer Anda? Mungkin ada yang berbeda dengan konfigurasi saya? Saya menggunakan Debian + LXDE.
sashoalm
1
Terima kasih, xhost +bekerja, dan tidak ada hal lain yang diperlukan (tidak perlu diatur $DISPLAY). Bisakah Anda memperbarui jawaban Anda, dan saya akan menerimanya?
sashoalm
5
Oh, temukan sesuatu. Pada Fedora 21, menjalankan xhostmemberikan daftar dalam format SI:localuser:USERNAME, jadi xhost SI:localuser:user2seharusnya berfungsi. Oh dan tampilan pengguna dapat ditemukan menggunakan w.
Wilf
7
xhost +akan memungkinkan pengguna di host mana pun yang dapat terhubung ke x-server Anda untuk mengakses layar Anda. xhost +SI:localuser:user2bekerja untuk saya di Debian.
robartsd
9

Anda perlu membagikan token otentikasi dari pengguna1 (dengan anggapan ~rumah pengguna1 ):

cat ~/.Xauthority | sudo -u user2 -i tee .Xauthority > /dev/null
pengguna4674453
sumber
1
Ini adalah satu-satunya jawaban yang cocok untuk saya (Ubuntu 14).
sudo
Solusi ini bekerja dengan baik dari dalam mesin jarak jauh (= klien X Win) sementara solusi xhost dalam jawaban lain harus dijalankan pada mesin lokal (= server X Win).
Jpsy
Mungkin lebih aman untuk digunakan tee -auntuk menghindari segala informasi yang ada  .Xauthority.
Scott
7

Anda dapat menggunakan penerusan X11:

ssh -XY otheruser@localhost your-gui-program-name-here
Michael Franzl
sumber
Ini solusi brilian. Yang paling sederhana yang pernah saya baca sejauh ini. Jauh lebih banyak orang yang mengenal ssh daripada dengan konfigurasi x11.
Alexis Panagiotopoulos
6

Anda dapat memulai aplikasi dari pengguna lain. Saya akan memulai aplikasi gimp dari user2, ketika sedang login (GUI) dengan pengguna 1:

$ xhost +
$ sudo su user2

(masukkan pass)

$ gimp

Nikmati :)

Antoni Stavrev
sumber
4
Ini sama dengan jawaban yang diterima empat tahun.
G-Man Mengatakan 'Reinstate Monica'
dapatkah Anda memberi tahu cara cepat yang lebih baik?
Antoni Stavrev
Saya selalu menggunakan metode ini, tetapi tidak lagi berfungsi untuk saya dengan Debian dan Xfce. ( koreksi : itu berhasil, tetapi saya harus export DISPLAYterlebih dahulu, seperti jawaban yang diterima mengatakan)
giusti
setelah Anda mengakhiri sesi Anda, baik untuk menonaktifkannya oleh$ xhost -
Antoni Stavrev
4

Anda dapat mencoba perintah sux:

sux user2

sux akan menangani barang $ DISPLAY untuk Anda. Anda mungkin perlu menginstalnya dengan:

sudo apt-get install sux

di bawah Debian / Ubuntu.

phil
sumber
4
suxtidak lagi dikirim oleh Debian atau Ubuntu. Alternatif terbaik yang bisa saya temukan adalah menambahkan xhost SI:localuser:root(atau pengguna apa pun) ~/.xprofileuntuk mengizinkannya secara permanen atau menggunakanrunuser
stefanct
Hingga dan termasuk Debian Stretch, ada gksu/ gksudoalternatif yang berfungsi dengan baik. Saat masih di Sid, itu dihapus di Buster untuk masalah keamanan.
Matija Nalis
0

Sebagai alternatif untuk sux, dengan aman menjalankan perintah grafis ( firefox-esrdalam contoh di bawah) seperti $AUTHUSER( guestdalam contoh di bawah):

AUTHUSER=guest
AUTHSTRING=SI:localuser:${AUTHUSER}
xhost +${AUTHSTRING} > /dev/null
SUDO_ASKPASS=/usr/bin/ssh-askpass
export SUDO_ASKPASS
sudo -k --askpass -u ${AUTHUSER} /usr/bin/firefox-esr
xhost -${AUTHSTRING} > /dev/null
sudo -K

kode tidak:

  1. memberikan guestpengguna akses ke pengguna Anda saat ini $DISPLAYmelaluixhost +SI:localuser:guest
  2. gunakan ssh-askpassuntuk meminta kata sandi Anda secara grafis (tentu saja, Anda dapat menggunakan sudoers(5) NOPASSWD:untuk menghindari ini, jika kebijakan keamanan Anda menganggapnya ok. Atau Anda dapat menggunakan askpassprogram lain , atau menentukannya dalam file konfigurasi (lihat sudo(8)detailnya di --askpass)
  3. jika kata sandinya ok (dan Anda memiliki izin sudoers(5)), ia menjalankan perintah /usr/bin/firefox-esrsebagai pengguna lain ( guest)
  4. setelah program selesai, izin untuk pengguna lain ( guest) untuk mengakses Anda $DISPLAYdicabut melaluixhost -SI:localuser:guest
  5. akhirnya, sudo -Kmenghapus kata sandi yang di-cache, jadi doa berikutnya ssh-askpassakan meminta Anda kata sandi lagi (alih-alih menggunakan kata sandi yang di-cache)

    sementara itu sedikit lebih banyak pekerjaan daripada apa gksu(8)atau apa yang sux(8)dilakukan, itu bisa dituliskan, dan itu jauh lebih aman daripada:

    • xhost + (setiap pengguna akan memiliki akses ke tampilan grafis Anda selama masih berlaku)
    • dapat dibaca ~ / .xauth oleh pengguna lain (akses tidak terbatas oleh pengguna ke layar Anda)
    • apa gksu/ yang suxdilakukan (salinan sementara ~/.Xauthority, yang memungkinkan pengguna tertentu untuk menyalin Anda MIT-MAGIC-COOKIE-1dan terus menggunakan layar Anda bahkan setelah gksu / sux selesai (selama Anda tidak mematikan mesin atau keluar dari layar - screensaver, hibernasi dll. tidak mengubah keajaiban) Kue kering).

karena hanya akan memungkinkan satu pengguna lokal mengakses layar Anda, dan kemudian hanya selama perintah berjalan (ketika perintah selesai, $AUTHUSERtidak akan lagi dapat mengakses layar Anda dengan cara apa pun).

Alternatif yang aman lainnya adalah ssh -X(tanpa -Yyang sebenarnya membuat Anda kurang aman! Lihat ForwardX11Trusteddi ssh_config(5)untuk rincian), seperti lebih mudah digunakan jika Anda tidak scripting, tapi itu menginduksi biaya overhead additinal (misalnya. Itu lebih lambat) dan beberapa program mungkin tidak bekerja dengan benar tanpa tidak aman -Y .

Matija Nalis
sumber
-1

Anda perlu memuat instalasi UI 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.

Panen 1018
sumber
(1) Tidak ada dalam pertanyaan ini yang mengharuskan berjalan sebagai root, atau di mana menjalankan sebagai root bermanfaat. (1b) Jika ada, menjalankan sebagai root dapat membingungkan banyak hal. (2) Jarang (jika pernah) ada alasan untuk menggunakannya sudo su. Gunakan  sudoatau  su; Pilih salah satu. (3) Pertanyaannya ditulis dalam bentuk  user1dan  user2. Silakan tulis jawaban Anda dalam hal  user1dan  user2. (Apakah atau tidak; tidak ada  tri.) (4) Jawaban Anda akan lebih baik jika itu termasuk penjelasan  SI:localuser. ... ... ... ... ... ... ... Tolong jangan menanggapi dalam komentar; edit  jawaban Anda untuk membuatnya lebih jelas dan lebih lengkap.
Scott