Запуск програми GUI як іншого (некористувального) користувача


34

Скажімо, у мене є 2 облікові записи користувачів user1і user2. Коли я ввійду в систему як user1, а потім перейду до user2використання su, я можу виконувати програми командного рядка, але програми графічного інтерфейсу виходять з ладу.

Приклад:

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

Тож як я можу запустити GUI-додаток?


Однією з головних причин, я виявив, що ця помилка полягає в тому, що $XAUTHORITYвона все ще встановлена ​​на user1 ~/.Xauthority, яку програма, я думаю, спробує прочитати, і вона не вдається, тому що для цього файлу зазвичай є режим 0600 ( -rw-------), це означає, що він недоступний для читання будь-хто з групи "інша", до якої входить user2. Це означає, що якщо ви chmod o+r ~/.Xauthority(як user1), ви зламали цю проблему. Я написав сценарій, який це демонструє.
Бреден Кращий

Відповіді:


42

su vs. su -

Ставши іншим користувачем, яким ви хочете користуватися su - user2. Тире змушує користувача2.bash_profile отримати джерело.

xhost

Крім того, вам потрібно буде надати користувачам доступ до вашого дисплея. Це регулює X. Ви можете використовувати команду, xhost +щоб дозволити іншим користувачам дозволити відображати графічний інтерфейс на робочому столі user1.

ПРИМІТКА. Під час запуску xhost +потрібно запустити це, перебуваючи в оболонці, що належить користувачеві1.

$ DISPLAY

Коли ви станете користувачем2, вам може знадобитися встановити змінну середовища $DISPLAY.

$ export DISPLAY=:0.0

1
xhost +user2все ще дає мені цю помилку - xhost: bad hostname "user2". Я гугл деякі, і, здається , мені потрібно зробити xhost +user2@laptopабо xhost +user2@localhostне впевнений , які. Тоді воно говорить xhost +user2@localhost being added to access control list.
sashoalm

1
Але навіть після додавання користувача до xhostі уточнення export DISPLAY=:0.0, біг leafpadвсе одно дає мені No protocol specified leafpad: Cannot open display:і не може запустити. Я знайшов це посилання на linuxquestions.org/questions/linux-newbie-8/… , де сказано, що є деякі чарівні файли cookie та xauth. Ви перевірили, що ці речі працюють на вашому комп'ютері? Можливо, у моїй конфігурації щось інше? Я на Debian + LXDE.
sashoalm

1
Дякую, xhost +працює, і більше нічого, здається, не потрібно (встановлювати не потрібно $DISPLAY). Чи можете ви оновити свою відповідь, і я прийму її?
sashoalm

5
О, знайшов щось. У Fedora 21 біг xhostдає список у форматі SI:localuser:USERNAME, так що xhost SI:localuser:user2слід працювати. О, і дисплей користувача можна знайти за допомогою w.
Вільф

7
xhost +дозволить будь-якому користувачеві на будь-якому хості, який може підключитися до вашого x-сервера, отримати доступ до вашого екрану. xhost +SI:localuser:user2працює для мене на Debian.
robartsd

9

Вам потрібно поділитися маркером аутентифікації з user1 (припускаючи , що ~є домом user1 ):

cat ~/.Xauthority | sudo -u user2 -i tee .Xauthority > /dev/null

1
Це єдина відповідь, яка працювала на мене (Ubuntu 14).
судо

Це рішення добре працює з віддаленої машини (= клієнт X Win), тоді як рішення xhost в інших відповідях повинні виконуватися на локальній машині (= сервер X Win).
Jpsy

Використовувати це може бути безпечніше, щоб tee -aуникнути крадіжки будь-якої наявної інформації в  .Xauthority.
Скотт

7

Ви можете використовувати перенаправлення X11:

ssh -XY otheruser@localhost your-gui-program-name-here

Це геніальне рішення. Найпростіший, який я читав поки що. Набагато більше людей знайомі з ssh, ніж з конфігурацією x11.
Олексій Панагіотопулос

6

Ви можете запустити додаток від іншого користувача. Я запускаю програму gimp від user2, під час входу (GUI) з користувачем 1:

$ xhost +
$ sudo su user2

(введіть пропуск)

$ gimp

Насолоджуйтесь :)


4
Це те саме, що чотирирічна прийнята відповідь.
G-Man каже: "Відновіть Моніку"

ви можете сказати швидкий кращий спосіб?
Антоній Ставрев

Я завжди використовував цей метод, але він більше не працює для мене з Debian і Xfce. ( виправлення : це справді працює, але я повинен export DISPLAYспочатку, як сказано у прийнятій відповіді)
giusti

після закінчення сеансу буде добре відключити його$ xhost -
Антоні Ставрев

4

Ви можете спробувати команду sux:

sux user2

sux буде обробляти $ DISPLAY речі для вас. Можливо, вам доведеться встановити його за допомогою:

sudo apt-get install sux

під Debian / Ubuntu.


4
suxбільше не постачається Debian або Ubuntu. Найкраща альтернатива, яку я міг би знайти, - це додавання xhost SI:localuser:root(або будь-якого користувача), ~/.xprofileщоб дозволити його постійно або використовуватиrunuser
stefanct

До Debian Stretch, включаючи альтернативу, було добре gksu/ gksudoальтернативно. Якщо він ще знаходиться в Sid, його видаляють в Buster з питань безпеки.
Matija Nalis

0

Як альтернатива suxбезпечному виконанню графічної команди ( firefox-esrна прикладі нижче) як $AUTHUSER( guestу прикладі нижче):

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

код робить:

  1. надає guestкористувачеві доступ до вашого поточного користувача $DISPLAYчерезxhost +SI:localuser:guest
  2. використовує ssh-askpassдля графічного запиту пароля (звичайно, ви можете використовувати його, sudoers(5) NOPASSWD:щоб уникнути цього, якщо ваша політика безпеки вважає це нормально. Або ви можете використовувати інші askpassпрограми або вказати їх у конфігураційних файлах (див. sudo(8)подробиці на --askpass)
  3. якщо пароль у порядку (і у вас є дозволи sudoers(5)), він виконує команду /usr/bin/firefox-esrяк інший користувач (guest )
  4. Після завершення програми анулювання дозволу іншому користувачеві ( guest) $DISPLAYанулюється черезxhost -SI:localuser:guest
  5. нарешті, sudo -Kвидаляє кешований пароль, тож наступне виклик ssh-askpassзнову попросить вас пароль (замість використання кешованого пароля)

    в той час як це трохи більше роботи , ніж те , gksu(8)чи sux(8)ж, це може бути сценарій, і це набагато безпечнішим , ніж:

    • xhost + (будь-який користувач матиме доступ до вашого графічного дисплея, поки він діє)
    • читабельна ~ / .xauth іншими користувачами (невизначений доступ цього користувача до вашого дисплея)
    • що gksu/ suxзробив (тимчасова копія ~/.Xauthority, яка дозволила вказаному користувачу скопіювати ваш MIT-MAGIC-COOKIE-1та продовжувати використовувати ваш дисплей навіть після закінчення gksu / sux (до тих пір, поки ви не вимкнули машину чи не вийшли з дисплея - заставки, сплячий режим тощо) не змінили магію печиво).

оскільки це дозволить лише одному локальному користувачеві отримати доступ до вашого дисплея, а потім лише до тих пір, поки команда запуститься (коли команда закінчиться, $AUTHUSERбільше не зможе отримати доступ до вашого дисплея жодним чином).

Інша безпечною альтернативою є ssh -X(без -Yякої на насправді робить вас менш безпечними! Див ForwardX11Trustedв ssh_config(5)подробиця), як це простіше у використанні , якщо ви не сценарії, але це викликає additinal накладних витрат (наприклад, він став повільніше) і деякі програми можуть не працювати правильно без небезпечних -Y .


-1

Вам потрібно завантажити інтерфейс установки як user2 .

Спробуйте дотримуватися цього:

Вхід як корінь :

sudo su

Перевірте x-сервер:

xclock

Якщо ви бачите годинник, який працює, це добре, зараз спробуйте запустити це:

xhost

Результат повинен бути таким:

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

Тепер дозвольте user2 отримати доступ до xhost

xhost +SI:localuser:user2

тепер спробуйте знову увійти до user2 та спробуйте відкрити будь-яку програму GUI.


(1) У цьому питанні немає нічого, що вимагає запуску як корінця або того, що працює як root, вигідно. (1b) Якщо що-небудь, запуск як root може просто заплутати питання. (2) Є рідко (якщо взагалі є) якісь причини використовувати sudo su. Використовувати  sudoабо  su; вибрати один. (3) Питання написано в термінах  user1і  user2. Будь ласка, напишіть свою відповідь через  user1та  user2. (Робити чи ні; немає  tri.) (4) Ваша відповідь буде краще, якби вона включала пояснення  SI:localuser. ………………… Будь ласка, не відповідайте на коментарі; відредагуйте  свою відповідь, щоб зробити її більш зрозумілою та повною.
Скотт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.