Могу ли я запустить графическую программу на рабочем столе другого пользователя от имени пользователя root?


39

Ниже приведены другие вопросы, которые, я думаю, мне нужно знать:

  • Из не X сессии? (имеется в виду, что root не вошел в X)

  • Если в X было зарегистрировано несколько человек, могу ли я автоматически определить, кто на каком экране, и, таким образом, программно определить, на каком экране мне нужно запустить приложение?

  • Могу ли я запустить приложение как пользователь? (хорошо, я на 99,999% уверен, что это да)

  • Могу ли я определить, вошли ли пользователи группы X в X?


Позаботьтесь о том, чтобы naga_plugged.plскрипт завершился (или разветвился на задний план), потому что udevбудет ждать его выхода.
rozcietrzewiacz

спасибо, я сделал это демоном, вызвав daemon (0,0) в коде c, который naga_plugged.pl вызывает последним. Я никогда не знал, что у них есть форумы Unix здесь. Они должны сделать все это одним сайтом, а не новыми доменами.
сверхоптимистичный

Ответы:


23

Чтобы запустить графическую программу на рабочем столе пользователя, вам нужно найти две вещи: какой экран рабочего стола пользователя включен (адрес) и какой файл cookie авторизации использовать (пароль).

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

who | awk -v user="$target_user" '$1 == user && $2 ~ "^:" {print $2}'

Найти авторизационный cookie немного сложнее. Вы должны найти файл cookie пользователя, который ~/.Xauthorityпо умолчанию (все, что вам нужно, это местоположение файла cookie, вам не нужно извлекать из него cookie). Это работает на многих системах, но не на всех; это зависит от диспетчера отображения и от того, как он настроен, и в частности Gdm (по умолчанию в Ubuntu) не использовал местоположение по умолчанию, которое я смотрел последним. Я не могу придумать портативный способ узнать настоящий X cookie-файл. Самый точный способ выяснить это - найти pid процесса X и найти аргумент для -authопции. Другой способ - найти процесс, работающий на этом X-сервере, и получить его XAUTHORITYпеременную environemnt. Если у вас возникли проблемы с поиском файла cookie, см.Откройте окно на удаленном дисплее X (почему «Не удается открыть дисплей»)?

Когда у вас есть обе части информации, поместите выбранный экран в DISPLAYпеременную среды, выбранный файл cookie авторизации X в XAUTHORITYпеременную среды, и все готово. Неважно, от какого пользователя запускается программа; в сочетании с, suесли хотите.


Как вы «ищите аргумент для опции -auth»?
rubo77

@ rubo77 С psили htopили ...
Жиль "ТАК - перестань быть злым"

ОК, так pids=$(pgrep -u $target_user nautilus)достает пид, а где мне поставить -authопцию?
rubo77

1
@ rubo77 Вы нигде не ставите -authопцию. Возможно, вам придется искать его в командной строке процесса X-сервера, чтобы выяснить, что поместить в XAUTHORITYпеременную окружения. Если у вас есть процесс клиента, вам не нужно ничего, -authкроме значения XAUTHORITYпеременной этого клиента . Я не понимаю, что ты пытаешься сделать. Вы можете задать новый вопрос.
Жиль "ТАК - перестань быть злым"

Я пытаюсь использовать вашу информацию здесь, чтобы решить, как создать уведомление на экране, инициируемое пользователем root
rubo77

11

Я не могу полностью попробовать это, так как на всех моих машинах отключен root.

Чтобы узнать, на каком дисплее находится пользователь, вы можете использовать whoкоманду. Последним столбцом вывода обычно является ОТОБРАЖЕНИЕ, в которое входит пользователь. Нечто подобное можно использовать для захвата только дисплея (вероятно, есть гораздо более эффективный способ сделать это, не стесняйтесь вносить изменения):

who | grep -m1 ^username.*\( | awk '{print $5}' | sed 's/[(|)]//g'

Затем для запуска графической команды X на этом дисплее:

DISPLAY=:0 firefox &

где: 0 будет заменено любым отображением, которое вы нашли в первой команде, а firefox будет заменено любой командой, которую вы хотите запустить. Вы можете поместить это в сценарий оболочки и просто использовать переменную.

Следующая часть - это часть, которую я не тестировал, но я не понимаю, почему это невозможно сделать:

su username -c "DISPLAY=:0 firefox"

запустить команду X от имени этого пользователя.


1
То, что root отключен, не означает, что материал не запускается как root;) Мне действительно нужно запускать его как скрипт, который запускается от имени root.
ксенотеррацид

@ xenoterracide, верно. Все, что я имел в виду, это то, что я не мог проверить это при всех возможных обстоятельствах. То есть я тестировал его только как пользователь root, sudo -iи не мог быть уверен, что результаты будут отличаться от запуска после входа в систему как root напрямую. :-)
Стивен Д

Мне пришлось немного изменить кто. Это, who | grep xeno| awk '{print $5}' | sed 's/[(|)]//g' | grep -v ^$ кажется, работает ...
xenoterracide

почему кто-то использует grep и sed, когда в цепочке уже есть awk, мне не под силу.

да ... "Learn AWK" был в моем списке задач уже некоторое время.
Стивен Д.

4

Вы можете посмотреть, как это делает acpid. Например, когда он запускает команды xscreensaver или закрывает экран для каждого пользователя, выполняющего X или X-сеанс.

Например, под Ubuntu этот файл содержит связанные вещи:

/etc/acpi/lid.sh

Содержит этот цикл:

for x in /tmp/.X11-unix/*; do
    displaynum=`echo $x | sed s#/tmp/.X11-unix/X##`
    getXuser;
    if [ x"$XAUTHORITY" != x"" ]; then
        export DISPLAY=":$displaynum"
        grep -q off-line /proc/acpi/ac_adapter/*/state
        if [ $? = 1 ]
            then
            if pidof xscreensaver > /dev/null; then 
                su $user -c "xscreensaver-command -unthrottle"
            fi
        fi
        if [ x$RADEON_LIGHT = xtrue ]; then
            [ -x /usr/sbin/radeontool ] && radeontool light on
        fi
        if [ `pidof xscreensaver` ]; then
            su $user -c "xscreensaver-command -deactivate"
        fi
        su $user -c "xset dpms force on"
    fi
done

В частности, код находится в /usr/share/acpi-support/power-funcs. Он вызывает, fgconsoleчтобы найти активный Linux vt, затем ищет X-сервер, отображаемый на этой консоли, и узнает пользователя оттуда. Затем он использует ~/.XauthorityX cookie, что, если я что-то упустил, означает, что он на самом деле не сможет подключиться к X серверу (настройка по умолчанию в Ubuntu, использующая gdm, не хранит X cookie в доме пользователя). каталог).
Жиль "ТАК ... перестать быть злым"

Например, @Gilles lid.sh не вызывает getXconsole. Таким образом, fgconsole не используется. Я обновил ответ с фрагментом, который я имел в виду. И это действительно работает на Ubuntu. Экран не отображается, когда я закрываю крышку.
maxschlepzig

1
В Ubuntu 14.04 я получаю ошибкуgetXuser: command not found
rubo77

1

Расширение ответа Жиля - как найти файл cookie. Один из способов сделать это может быть после того, как вы установите DISPLAYпеременную окружения (как описано Gilles), используйте straceдля поиска xhostдоступа к файлам . Я могу думать о чем-то вроде этого в BASH:

# Set the DISPLAY variable first
DISPLAY = :0.0
# Use strace on xhost
strace xhost 2>&1 | grep access

Вывод из кода выше будет выглядеть так:

access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
access("/home/someuser/.Xauthority", R_OK) = 0

Как вы можете видеть, файл cookie будет отображаться здесь.


0

В моих исследованиях по поиску элегантного способа отображения задач с графическим интерфейсом или X из ограниченной среды, такой как правила udev или от суперпользователя, я недавно создал инструмент, подходящий для него ( для более подробной информации ).

xpub скрипт оболочки для получения переменных среды отображения X, касающихся текущего или заданного TTY

Это пример с правилом udev:

IMPORT{program}="/usr/bin/xpub", \
RUN+="/bin/su $env{XUSER} -c '/usr/bin/notify-send Hello'"

$env{ENV}: если текущий пользователь tty запускает X, в противном случае удалите его.

Принцип тот же для командной строки, использующей export:

export $(xpub) ; su ${XUSER} -c 'notify-send Hello'

1
Я предлагаю вам сделать кристально ясным, что вы являетесь автором этого сценария xpub.
Дмитрий Григорьев
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.