Запуск приложения с графическим интерфейсом от имени другого пользователя (не root)


34

Допустим, у меня есть 2 учетных записи user1и user2. Когда я вхожу в систему как user1, а затем переключаюсь на user2использование su, я могу выполнять программы командной строки, но программы GUI терпят неудачу.

Пример:

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

Так как я могу запустить приложение с графическим интерфейсом?


Я обнаружил, что одна из основных причин этого сбоя заключается в том, что $XAUTHORITYон по-прежнему настроен на user1 ~/.Xauthority, который, я полагаю, попытается прочитать программой, и не получится, поскольку этот файл обычно имеет режим 0600 ( -rw-------), то есть он недоступен для чтения кем-либо из группы «другие», в которую входит пользователь2. Это означает, что если вы chmod o+r ~/.Xauthority(как пользователь 1), вы решите эту проблему. Я написал сценарий, который демонстрирует это.
Брэден Бест

Ответы:


42

Су против Су -

Став другим пользователем, вы обычно хотите использовать su - user2. Черта заставит user2's .bash_profileполучить источник.

Xhost

Кроме того, вам нужно предоставить пользователям доступ к вашему дисплею. Это регулируется X. Вы можете использовать команду, xhost +чтобы разрешить другим пользователям разрешение отображать GUI на рабочем столе пользователя user1.

ПРИМЕЧАНИЕ. Во время работы xhost +вы захотите запустить его, находясь в оболочке, принадлежащей user1.

$ DISPLAY

Когда вы станете user2, вам может потребоваться установить переменную окружения $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/… , в которой говорится, что есть некоторые волшебные куки и 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 из-за проблем безопасности.
Матия Налис

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 .

Попробуйте следовать этому:

Войдите в систему как root :

sudo su

Проверьте сервер x:

xclock

Если вы видите, что часы работают, это хорошо, теперь попробуйте запустить это:

xhost

Результат должен выглядеть так:

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

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

xhost +SI:localuser:user2

Теперь попробуйте снова войти в user2 и попробуйте открыть любую из программ GUI.


(1) В этом вопросе нет ничего такого, что требовало бы запуска от имени пользователя root или использования в качестве пользователя 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.