Чому я не можу запустити програми GUI з "root": "Не вказано протокол"?


38

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

Наприклад:

sudo -i
glxgears

Створює такий вихід:

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

Але коли я вперше відкриваю термінал, я можу працювати glxgearsз облікового запису користувача. Тільки після того, як я це вирішу sudo -i, проблема вирішується. Це відбувається для будь-якого додатка GUI, який я намагаюся запустити. Я думаю, що це, ймовірно, пов'язане з 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 +виправили мою проблему
небезпека89

3
Будьте в курсі, що xhost +повністю вимикає автентифікацію та дозволяє кожному отримати доступ до всіх програм на екрані ...
michas

1
для debian, чи я ввожу експорт XAUTHORITY як корінь? тому що він не працює на deb10? Я входжу з sudo su
marinara

@marinara використовувати sudo -iзамість sudo su -.
michas

23

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

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

На жаль, ця команда не вдалася з тією ж помилкою, що і в питанні (тобто не вказано протокол і не можна відкрити показ)

Моє рішення полягало в тому, щоб просто додати foo користувача до списку дозволеного доступу до X-сервера.

xhost si:localuser:foo

І це було все, я тоді зміг запустити Firefox (та інший додаток X) за допомогою sudoта foo користувача.

Фон : у вікні X є архітектура клієнт / сервер. Під час запуску програми ви вимагаєте авторизації сервера 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 ON).


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, я не можу використовувати GPU. Це означає, що я не можу віддалено перезавантажити машину і все ще маю доступ до GPU.
cbcoutinho

1
@cbcoutinho X Window - це архітектура сервера клієнтів. Коли ви підключаєтесь через ssh, ваша локальна робоча станція стає клієнтом X Window. Ви можете використовувати xhost з небезпечними протоколами, такими як rlogin, але не ssh. Вам потрібно доручити ssh зробити це за вас. Або використовуйте прапор -Xабо (краще?) -YНа ssh, це зробить правильне перенаправлення. Звичайно, тоді вам потрібен локальний сервер C. Однак з GPU та OpenGL я не впевнений, де відбувається візуалізація / обчислення, можливо, це на стороні клієнта, а не на сервері. Може бути складним.
Гюйгенс

10

Ви можете будь-який

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

або

Встановіть змінну середовища в сценарій входу в корінь (один із .bashrc, .profile, .bash_profile ...).

export DISPLAY=:0.0

Ви можете перевірити, чи встановлено,

$ env |grep DISPLAY
DISPLAY=:0.0

Щоб відкрити ваш дисплей для всіх користувачів з усіх хостів як звичайного користувача, ви можете зробити це за допомогою:

xhost +


1
xhost + працює як тимчасовий захід до того, як вступити як судо
Восьминіг

1
xhost +працював і для мене, лише те, що вони забули згадати, ми повинні запустити його з терміналу користувача, що надає право, а не з терміналу sudo su.
nyxee

1
ідеальна робота, як бум
Адіій

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. Перевірте щойно створений ключ із змінною root xAuthority` xauth list' asкористувача вказує на той самий файл.and(they should be the same if your

  3. Voila, rootматиме доступ до будь-якого X-Appз терміналу, але лише тимчасово.

Щоб зробити його постійним, дивіться відповідь @Huygens!


1

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

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

Нам просто потрібно додати root користувача до x, ви можете це робити під час входу за допомогою сценарію запуску

xhost local:root

З метою тестування ми можемо просто запустити команду, ніж команда під поточним користувачем, і перезапустити кореневий скрипт / роботу / службу / ...


Цікаво, чому ви запускаєте додаток gui через cron?
Восьминіг

у моєму дистрибутиві у мене є робота з кореневим крон (мсек), яка перевіряє стан безпеки системи та робить звіт ... тож замість того, щоб ходити в журнали, щоб перевірити цей звіт, я вважаю за краще мати спливаюче меню із звітом, коли ця робота виконується
intika

ЦЕ працювало на мене
Маркус Вініцій Помпеу

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

2
Це дозволить отримати cp: cannot stat ‘/home/user/.Xauthority’: No such file or directoryбудь-яку з 10+ версій Debian, до яких я маю доступ.
Антон

Це дає невеликий контекст (наприклад, ви мовчки очікуєте деякого поточного каталогу), і ви не згадуєте про такі побічні ефекти, як проблеми, коли це роблять у кількох екземплярах X11. Я думаю, що цей спосіб трохи химерний.
v6ak
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.