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

ОСНОВАННЫЕ НА ОБ/МИН дистрибутивы как Red Hat легки:

rpm -qa --last

На Debian и других находящихся в dpkg дистрибутивах, Ваша определенная проблема легка также:

grep install /var/log/dpkg.log

Если файл журнала не был повернут, в этом случае необходимо попробовать:

grep install /var/log/dpkg.log /var/log/dpkg.log.1

В целом, dpkg и apt кажется, не отслеживаю дату установки, идущую отсутствием никакого подобного поля в dpkg-query страница справочника.

И в конечном счете старый /var/log/dpkg.log.* файлы будут удалены вращением журнала, так, чтобы путь, как гарантировали, не будет давать Вам всю историю Вашей системы.

Одно предложение, которое появляется несколько раз (например, этот поток) должно посмотреть на /var/lib/dpkg/info каталог. Файлы там предполагают, что Вы могли бы попробовать что-то как:

ls -t /var/lib/dpkg/info/*.list | sed -e 's/\.list$//' | head -n 50

Для ответа на вопрос о выборах вот, первичная обработка.

список сборки пакетов датами

$ find /var/lib/dpkg/info -name "*.list" -exec stat -c $'%n\t%y' {} \; | \
    sed -e 's,/var/lib/dpkg/info/,,' -e 's,\.list\t,\t,' | \
    sort > ~/dpkglist.dates

список сборки установленных пакетов

$ dpkg --get-selections | sed -ne '/\tinstall$/{s/[[:space:]].*//;p}' | \
    sort > ~/dpkglist.selections

присоединитесь к 2 спискам

$ join -1 1 -2 1 -t $'\t' ~/dpkglist.selections ~/dpkglist.dates \
    > ~/dpkglist.selectiondates

По некоторым причинам это не печатает очень много различий для меня, таким образом, могла бы быть ошибка или недопустимое предположение о какой --get-selections средства.

Можно, очевидно, ограничить пакеты любой при помощи find . -mtime - или head -n , и измените выходной формат как Вам угодно, например.

$ find /var/lib/dpkg/info -name "*.list" -mtime -4 | \
    sed -e 's,/var/lib/dpkg/info/,,' -e 's,\.list$,,' | \
    sort > ~/dpkglist.recent

$ join -1 1 -2 1 -t $'\t' ~/dpkglist.selections ~/dpkglist.recent \
    > ~/dpkglist.recentselections

перечислять только выборы, которые были установлены (измененный?) за прошедшие 4 дня.

Вы могли, вероятно, также удалить sort команды после проверки порядка сортировки, используемого dpkg --get-selections и сделайте find более эффективная команда.

39
08.01.2012, 14:05
5 ответов

Для запуска графической программы на рабочем столе пользователя необходимо найти две вещи: что отображается, рабочий стол пользователя идет (адрес) и что 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 переменная среды, выбранный X файлов cookie полномочий в XAUTHORITY переменная среды, и Вы установлены. Это не имеет значения что пользователь прогоны программы как; объединение с su если Вам нравится.

23
27.01.2020, 19:35
  • 1
    Как делают Ваш, "ищут аргумент - подлинная опция"? –  rubo77 16.10.2014, 18:59
  • 2
    @rubo77 С ps или htop или … –  Gilles 'SO- stop being evil' 16.10.2014, 19:01
  • 3
    OK, таким образом, pids=$(pgrep -u $target_user nautilus) получает pid, и куда я должен поместить -auth опция? –  rubo77 16.10.2014, 19:08
  • 4
    @rubo77 Вы не помещаете a -auth опция где угодно. Вы, возможно, должны искать его в командной строке процесса X-сервера для выяснения, что вставить XAUTHORITY переменная среды. Если у Вас есть процесс клиента, в чем Вы нуждаетесь, ничто о -auth но значение того клиента XAUTHORITY переменная. Я не понимаю то, что Вы пытаетесь сделать. Можно хотеть задать новый вопрос. –  Gilles 'SO- stop being evil' 16.10.2014, 19:12
  • 5
    , который я пытаюсь использовать Вашу информацию здесь, чтобы решить, как Создать уведомление на экране, инициируемом корневым –  rubo77 16.10.2014, 19:21

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

Для нахождения, какой дисплей пользователь работает можно использовать who команда. Последним столбцом вывода обычно является ДИСПЛЕЙ, на котором зарегистрирован пользователь. Что-то вроде этого могло использоваться для захвата просто дисплея (там вероятно намного более эффективный способ сделать это, не стесняйтесь предлагать редактирования):

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

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

DISPLAY=:0 firefox &

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

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

su username -c "DISPLAY=:0 firefox"

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

11
27.01.2020, 19:35
  • 1
    Просто, потому что корень отключен, не означает, что материал не становится выполненным как корень ;) Я на самом деле должен выполнить это как скрипт, который это запускает как корень. –  xenoterracide 05.09.2010, 01:18
  • 2
    @xenoterracide, право. Все, что я имел в виду, было то, что я не мог протестировать его при всех возможных обстоятельствах. Таким образом, я только протестировал его как корневое использование sudo -i и не могло быть уверено, будут ли результаты отличаться, чем выполнение его после входа в систему как корень непосредственно. :-) –  Steven D 05.09.2010, 01:21
  • 3
    я должен был изменить кто немного. Это who | grep xeno| awk '{print $5}' | sed 's/[(|)]//g' | grep -v ^$ кажется, работает... –  xenoterracide 05.09.2010, 01:38
  • 4
    , почему любой использует grep и sed, когда уже существует awk в цепочке, вне меня. –   05.09.2010, 11:40
  • 5
    да... "узнает, что awk" был в моем списке ожидающих выполнения задач некоторое время теперь. –  Steven D 05.09.2010, 12:18

Вы могли посмотреть на то, как 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
4
27.01.2020, 19:35
  • 1
    А именно, код находится в /usr/share/acpi-support/power-funcs. Это звонит fgconsole найти активный Linux vt, затем ищет X-сервер, отображающийся на этой консоли, и узнает пользователя оттуда. Затем это использует ~/.Xauthority как X cookie, который, если нет что-то, которое я пропускаю средства, которые он на самом деле не сможет подключить к X-серверу (установка Ubuntu по умолчанию, с помощью gdm, не хранит эти X cookie в корневом каталоге пользователя). –  Gilles 'SO- stop being evil' 05.09.2010, 02:06
  • 2
    @Gilles lid.sh, например, не называет getXconsole. Таким образом fgconsole не используется. Я обновил ответ с отрывком, который я имел в виду. И это на самом деле работает над Ubuntu. Экран очищен, когда я закрываю крышку. –  maxschlepzig 05.09.2010, 10:57
  • 3
    В ubuntu 14.04 I получают ошибку getXuser: command not found –  rubo77 16.10.2014, 19:15

Расширение ответа Gilles состоит в том, как найти файл 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 непосредственно появится здесь.

1
27.01.2020, 19:35

В моем исследовании поиска элегантного способа отображения задач 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 $(xpub) ; su ${XUSER} -c 'notify-send Hello'
0
20.08.2021, 13:40

Теги

Похожие вопросы