Почему я не могу запустить приложения с графическим интерфейсом из «root»: «Протокол не указан»?

39

Я установил Debian на мою машину прошлой ночью. Теперь я не понимаю, почему я не могу запускать приложения с графическим интерфейсом из терминала при запуске от имени пользователя root.

Например:

sudo -i
glxgears

Создает следующий вывод:

No protocol specified
Error: couldn't open display :0

Но когда я впервые открываю терминал, я могу работать glxgearsс учетной записью пользователя. Только после того, как я это сделаю sudo -i, проблема возникнет. Это происходит для любого приложения с графическим интерфейсом, которое я пытаюсь запустить. Я думаю, что это, вероятно, связано с X11, но я не уверен.

Осьминог
источник
1
stackoverflow.com/a/20612084 это отлично сработало для меня.

Ответы:

39

Доступ к X-серверу требует двух вещей:

  • $DISPLAYПеременная указывает на правильный дисплей (обычно :0)
  • Правильная информация для аутентификации

Информация аутентификации может быть явно указана через $XAUTHORITY, и по умолчанию в ~/.Xauthorityпротивном случае.

Если $DISPLAYи $XAUTHORITYустановлен для вашего пользователя, sudoто установит их и для новой оболочки, и все должно работать нормально.

Если они не установлены, они, вероятно, по умолчанию будут использовать неправильные значения, и вы не сможете запускать и X-приложения.

В Debian $XAUTHORITYэто обычно не устанавливается явно. Просто добавь

export XAUTHORITY=~/.Xauthority

Вам .bashrcили прямо говорят XAUTHORITY=~/.Xauthority sudo ...и все должно работать.

Вы также можете использовать xauth listдля проверки наличия правильной информации аутентификации.

Михась
источник
1
xauth infoпоказывает путь к авторитетному файлу
Томас Томечек
1
xhost +исправил мою проблему
danger89
3
Имейте в виду, что xhost +полностью деактивирует аутентификацию и позволяет каждому получить доступ ко всем приложениям на вашем экране ...
michas
1
для debian я могу ввести экспорт XAUTHORITY от имени root? потому что это не работает на deb10? Я вхожу с sudo su
marinara
@marinara использовать sudo -iвместо sudo su -.
Михас
24

У меня был такой же вопрос, как и у вас, но для обычного пользователя. Допустим, я хочу запустить firefox, используя учетную запись пользователя foo. Я вошел как бар:

[bar@localhost ~]$ sudo -u foo -H firefox

К сожалению, эта команда завершилась с той же ошибкой, что и в вопросе (т. Е. Протокол не указан и не может открыть дисплей)

Моим решением было просто добавить пользователя foo в список авторизованного доступа к X-серверу.

xhost si:localuser:foo

И все, я смог запустить Firefox (и другое приложение X), используя sudoпользователя foo.

Справочная информация : в X Window существует архитектура клиент / сервер. Когда вы запускаете приложение, вы запрашиваете у X-сервера авторизацию для его отображения. По умолчанию, когда вы открываете сеанс (вы входите в систему графически), вам (вашему пользователю), очевидно, разрешается общаться с сервером и отображать приложения. Другие пользователи не имеют этого разрешения, если вы не укажете его. xhostинструмент для манипулирования списком разрешений siУказывает на то, что правило на стороне сервера и авторизации локального пользователя fooк приложениям дисплея. X Window очень мощен в этом отношении, и вы можете отображать удаленные приложения локально, играя с DISPLAYпеременной окружения и xhost(но не ограничиваясь ими). В старые времена, когда люди печаталиxhost + и косвенно позволил каждому использовать свой сеанс X, стало возможным отображать приложение на экране для шалостей ;-) не так много в наше время, как люди все меньше и меньше используют архитектуру клиент / сервер X Window (по крайней мере, что я наблюдаю в последние 10 лет).

PS: Я сделал это для того, чтобы запустить Firefox в своего рода «тюрьме» (чтобы избежать такой уязвимости, как для pdf.js в будущем). Но я быстро обнаружил, что вызов Firefox через sudo не позволит ему получить доступ ни к аудио, ни к видеооборудованию. Но есть один парень, который четко объясняет, как активировать аппаратное ускорение видео и аудио при вызове Firefox через sudo . YMMV с этими инструкциями, например, мне по-прежнему отказано в разрешении на аудио, но видео в порядке (проверено на Fedora 22 с включенным SELinux).

Гюйгенс
источник
1
В моем случае fooбыло root, т.е. мне пришлось работать xhost si:localuser:rootна Ubuntu 17.10.
Карл Рихтер
Куда вы добавляете xhost si:localhost<user>команду? Если ни один пользователь не вошел в систему, то ни у кого нет доступного X-сервера для разрешения.
cbcoutinho
@cbcoutinho Вышеупомянутый вариант использования - это когда кто-то вошел в систему и хочет запустить приложение XWindow как кто-то еще на том же хосте. Если вы объясните свой вариант использования (какую проблему вы хотите решить), я потенциально могу вам помочь.
Гюйгенс
@Huygens У меня есть рабочая станция для моделирования жидкостей, которая также оснащена графическим процессором. Визуализации я создаю с ParaViewпомощью программы, построенной vtk, как правило, на самой рабочей станции. ParaViewтакже предоставляет безопасную модель рендеринга клиент / сервер без использования ssh, которую я хотел бы использовать вместо удаленной VNC. Без входа на рабочую станцию ​​и выполнения xhostя не могу использовать графический процессор. Это означает, что я не могу перезагрузить компьютер удаленно и все еще иметь доступ к графическому процессору.
cbcoutinho
1
@cbcoutinho X Window - это архитектура клиент-сервер. Когда вы подключаетесь через ssh, ваша локальная рабочая станция становится клиентом X Window. Вы можете использовать xhost с небезопасными протоколами, такими как rlogin, но не ssh. Вам нужно дать команду ssh сделать это за вас. Либо используйте флаг -Xили (лучше?) -YНа ssh, он сделает правильное перенаправление. Конечно, тогда вам нужен локальный C-сервер. Однако с GPU и OpenGL я не уверен, где происходит рендеринг / вычисления, возможно, это на стороне клиента, а не на сервере. Может быть сложно.
Гюйгенс
10

Вы также можете

Укажите отображение, которое будет использоваться в командной строке, добавив -display :0.0

или

Установите переменную окружения в скрипте входа в систему root (один из .bashrc, .profile, .bash_profile ...).

export DISPLAY=:0.0

Вы можете проверить, установлен ли он,

$ env |grep DISPLAY
DISPLAY=:0.0

Чтобы открыть ваш дисплей для всех пользователей со всех хостов как обычного пользователя, вы можете сделать это с помощью:

xhost +

X Тянь
источник
1
xhost + работает как временная мера перед тем, как войти в sudo
Octopus
1
xhost +работал для меня тоже, только то, что они забыли упомянуть, что мы должны запускать его из терминала авторизующего пользователя, а не из терминала под sudo su.
nyxee
1
идеальная работа, как бум
Adiii
3

Учитывая, что вы работаете в Debian, простое и поддерживаемое решение - организовать sudoкопирование учетных данных авторизации X11. pam_xauthвходит в libpam-modulesкомплект именно для этой цели; чтобы использовать его, вам просто нужно добавить

session  optional  pam_xauth.so

в ваш /etc/pam.d/sudoфайл. Вы также можете добавить его в su. Для полной информации, обратитесь к справочной pam_xauthстранице, конечно.

Тоби Спейт
источник
2

Что помогло мне:

  1. Вы можете xauth generate :0 . trustedна userстороне, которая будет генерировать новыйMIT-MAGIC-COOKIE-1
  2. Проверьте, что вновь созданный Ключ с xauth list' asпользовательской andкорневой (they should be the same if yourпеременной xAuthority` указывает на тот же файл.

  3. Вуаля, rootбудет доступ к любому X-Appиз терминала, но только временно.

Чтобы сделать его постоянным, смотрите ответ @Huygens!

Timo
источник
1

Альтернативное решение :

Такие службы, как cron, работающие под root, не имеют доступа к отображению, если текущий пользователь x не является root.

Нам просто нужно добавить пользователя root в x, вы можете сделать это во время входа в систему с помощью сценария запуска

xhost local:root

В целях тестирования мы можем просто запустить команду под текущим пользователем и перезапустить корневой скрипт / job / service / ...

intika
источник
Просто любопытно, почему вы запускаете приложение с графическим интерфейсом через cron?
Осьминог
в моем дистрибутиве у меня есть задание root cron (msec), которое проверяет работоспособность системы безопасности и составляет отчет ... поэтому вместо того, чтобы заходить в журналы для проверки этого отчета, я предпочитаю иметь всплывающий графический интерфейс с отчетом при запуске этого задания
интика
Это сработало для меня
Маркус Виниций Помпеу
0

Команда sudoимеет переключатель для сохранения переменных среды.

 -E, --preserve-env            preserve user environment when running command

Так что вы можете запустить команду с ключом -E. Пример:

sudo -E wireshark

Если вам не нужно запускать критически важные приложения, такие как веб-браузеры, вам лучше добавить ключ -E с помощью sudo. Мы не можем запустить Chrome или Firefox, просто добавив ключ -E . Потому что во многих браузерах реализована защита от нарушений пространства пользователя. @ Гюйгенс ответ может иметь понимание по этому вопросу.

Примечание. Добавление ключа -E не поможет, если среда вашего пользователя НЕ имеет DISPLAY и XAUTHORITY уже настроена правильно .

шань
источник
-1

используйте эту команду, и она будет работать

sudo cp /home/user/.Xauthority .Xauthority
user187508
источник
2
Это даст cp: cannot stat ‘/home/user/.Xauthority’: No such file or directoryна любой из 10+ машин на основе Debian, к которым у меня есть доступ.
Антон
Это дает немного контекста (например, вы молча ожидаете какой-то текущий каталог), и вы не упоминаете побочные эффекты, такие как проблемы, при выполнении в нескольких экземплярах X11. Я думаю, что этот способ немного хакерский.
v6ak