Ниже приведены другие вопросы, которые, я думаю, мне нужно знать:
Из не X сессии? (имеется в виду, что root не вошел в X)
Если в X было зарегистрировано несколько человек, могу ли я автоматически определить, кто на каком экране, и, таким образом, программно определить, на каком экране мне нужно запустить приложение?
Могу ли я запустить приложение как пользователь? (хорошо, я на 99,999% уверен, что это да)
Могу ли я определить, вошли ли пользователи группы X в X?
naga_plugged.pl
скрипт завершился (или разветвился на задний план), потому чтоudev
будет ждать его выхода.Ответы:
Чтобы запустить графическую программу на рабочем столе пользователя, вам нужно найти две вещи: какой экран рабочего стола пользователя включен (адрес) и какой файл cookie авторизации использовать (пароль).
Следующая команда должна перечислить локальные дисплеи, в которые входит пользователь (по одному на строку) в большинстве устройств:
Найти авторизационный cookie немного сложнее. Вы должны найти файл cookie пользователя, который
~/.Xauthority
по умолчанию (все, что вам нужно, это местоположение файла cookie, вам не нужно извлекать из него cookie). Это работает на многих системах, но не на всех; это зависит от диспетчера отображения и от того, как он настроен, и в частности Gdm (по умолчанию в Ubuntu) не использовал местоположение по умолчанию, которое я смотрел последним. Я не могу придумать портативный способ узнать настоящий X cookie-файл. Самый точный способ выяснить это - найти pid процесса X и найти аргумент для-auth
опции. Другой способ - найти процесс, работающий на этом X-сервере, и получить егоXAUTHORITY
переменную environemnt. Если у вас возникли проблемы с поиском файла cookie, см.Откройте окно на удаленном дисплее X (почему «Не удается открыть дисплей»)?Когда у вас есть обе части информации, поместите выбранный экран в
DISPLAY
переменную среды, выбранный файл cookie авторизации X вXAUTHORITY
переменную среды, и все готово. Неважно, от какого пользователя запускается программа; в сочетании с,su
если хотите.источник
ps
илиhtop
или ...pids=$(pgrep -u $target_user nautilus)
достает пид, а где мне поставить-auth
опцию?-auth
опцию. Возможно, вам придется искать его в командной строке процесса X-сервера, чтобы выяснить, что поместить вXAUTHORITY
переменную окружения. Если у вас есть процесс клиента, вам не нужно ничего,-auth
кроме значенияXAUTHORITY
переменной этого клиента . Я не понимаю, что ты пытаешься сделать. Вы можете задать новый вопрос.Я не могу полностью попробовать это, так как на всех моих машинах отключен root.
Чтобы узнать, на каком дисплее находится пользователь, вы можете использовать
who
команду. Последним столбцом вывода обычно является ОТОБРАЖЕНИЕ, в которое входит пользователь. Нечто подобное можно использовать для захвата только дисплея (вероятно, есть гораздо более эффективный способ сделать это, не стесняйтесь вносить изменения):Затем для запуска графической команды X на этом дисплее:
где: 0 будет заменено любым отображением, которое вы нашли в первой команде, а firefox будет заменено любой командой, которую вы хотите запустить. Вы можете поместить это в сценарий оболочки и просто использовать переменную.
Следующая часть - это часть, которую я не тестировал, но я не понимаю, почему это невозможно сделать:
запустить команду X от имени этого пользователя.
источник
sudo -i
и не мог быть уверен, что результаты будут отличаться от запуска после входа в систему как root напрямую. :-)who | grep xeno| awk '{print $5}' | sed 's/[(|)]//g' | grep -v ^$
кажется, работает ...Вы можете посмотреть, как это делает acpid. Например, когда он запускает команды xscreensaver или закрывает экран для каждого пользователя, выполняющего X или X-сеанс.
Например, под Ubuntu этот файл содержит связанные вещи:
Содержит этот цикл:
источник
/usr/share/acpi-support/power-funcs
. Он вызывает,fgconsole
чтобы найти активный Linux vt, затем ищет X-сервер, отображаемый на этой консоли, и узнает пользователя оттуда. Затем он использует~/.Xauthority
X cookie, что, если я что-то упустил, означает, что он на самом деле не сможет подключиться к X серверу (настройка по умолчанию в Ubuntu, использующая gdm, не хранит X cookie в доме пользователя). каталог).getXuser: command not found
Расширение ответа Жиля - как найти файл cookie. Один из способов сделать это может быть после того, как вы установите
DISPLAY
переменную окружения (как описано Gilles), используйтеstrace
для поискаxhost
доступа к файлам . Я могу думать о чем-то вроде этого в BASH:Вывод из кода выше будет выглядеть так:
Как вы можете видеть, файл cookie будет отображаться здесь.
источник
В моих исследованиях по поиску элегантного способа отображения задач с графическим интерфейсом или X из ограниченной среды, такой как правила udev или от суперпользователя, я недавно создал инструмент, подходящий для него ( для более подробной информации ).
xpub
скрипт оболочки для получения переменных среды отображения X, касающихся текущего или заданного TTYЭто пример с правилом udev:
$env{ENV}
: если текущий пользователь tty запускает X, в противном случае удалите его.Принцип тот же для командной строки, использующей
export
:источник