Чи можна запустити графічну програму на робочому столі іншого користувача як root?


39

Далі є інші питання, які, я думаю, мені потрібно знати:

  • З не X сесії? (значить корінь не увійшов до X)

  • Якщо на X входило декілька людей, чи можу я автоматично визначити, хто на якому екрані, і таким чином програмно визначити, на якому екрані мені потрібно запустити додаток?

  • Чи можу я запустити додаток як користувач? (нормально, я 99,999% впевнений, що це так)

  • Чи можу я виявити, чи користувачі групи X увійшли до X?


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

дякую, я зробив це демоном, зателефонувавши демону (0,0) у коді c, який naga_plugged.pl дзвонить останнім. Я ніколи не був у них форумами Unix. Вони повинні зробити все це одним сайтом замість нових доменів.
over_optimistic

Відповіді:


23

Щоб запустити графічну програму на робочому столі користувача, потрібно знайти дві речі: на якому дисплеї відображається робочий стіл користувача (адреса) та який cookie-авторизатор використовувати (пароль).

Наступна команда повинна перераховувати локальні екрани, на яких користувач увійшов (по одному на рядок) у більшості об'єктів:

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

Знайти файл cookie авторизації трохи складніше. Ви повинні шукати файл файлів cookie користувача, який ~/.Xauthorityза замовчуванням (все, що вам потрібно, це розташування файлу cookie, вам не потрібно витягати з нього файл cookie). Це працює у багатьох системах, але не у всіх; це залежить від диспетчера дисплеїв і того, як він налаштований, і зокрема Gdm (типовий для Ubuntu) не використовував розташування за замовчуванням востаннє, що я подивився. Я не можу придумати портативний спосіб дізнатися фактичний файл файлів cookie X. Найбільш точний спосіб це з'ясувати - дізнатися pid процесу X та шукати аргумент до -authваріанту. Інший спосіб - знайти процес, що працює на цьому сервері X, і схопити його XAUTHORITYзмінну навколишнього середовища. Якщо у вас виникли проблеми з пошуком файлу cookie, дивВідкрийте вікно на віддаленому дисплеї X (чому "Не вдається відкрити дисплей")?

Коли ви маєте обидві частини інформації, покладіть вибраний дисплей у DISPLAYзмінну середовища, вибраний файл файлів cookie X у XAUTHORITYзмінну оточення, і ви налаштовані. Не має значення, для якого користувача працює програма; комбінуй, suякщо тобі подобається.


Як ваше "шукати аргумент на варіант -auth"?
rubo77

@ rubo77 З psабо htopабо…
"SO- перестань бути злим"

Гаразд, так pids=$(pgrep -u $target_user nautilus)отримує pid, і де я повинен поставити -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, використовуючи root, sudo -iі не міг бути впевнений, чи будуть результати відрізнятися від запуску після входу як кореня безпосередньо. :-)
Стівен Д

Мені довелося трохи модифікувати кого. Це, who | grep xeno| awk '{print $5}' | sed 's/[(|)]//g' | grep -v ^$ здається, працює ...
xenoterracide

чому хтось використовує grep і sed, коли в ланцюзі вже є awk, це поза мною.

так ... "Learn awk" вже деякий час є у моєму списку todo.
Стівен Д

4

Ви можете подивитися, як це швидко робиться. Наприклад, коли він видає команди 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-сервер, який відображається на цій консолі, і з'ясовує користувача звідти. Потім він використовує ~/.Xauthorityяк файл cookie X, якщо, якщо чогось мені не вистачає, це означає, що він насправді не зможе підключитися до сервера X (настройка за замовчуванням Ubuntu за допомогою gdm не зберігає файли cookie X у домі користувача каталог).
Жил "ТАК - перестань бути злим"

@Gilles lid.sh, наприклад, не викликає getXconsole. Таким чином, фгконсоль не використовується. Я оновив відповідь фрагментом, який я мав на увазі. І це насправді працює на 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

У моєму дослідженні пошуку елегантного способу відображення задач GUI або 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.