Как я должен определить, если пользователь вошел в систему графически во время работы lightdm?

Я хочу знать, если кто-то вошел в локальную X-сессию. В прошлом я смотрел на вывод ck-list-session. Вывод выглядел примерно так:

Session12:
    unix-user = '[redacted]'
    realname = '[redacted]'
    seat = 'Seat1'
    session-type = ''
    active = TRUE
    x11-display = ':0'
    x11-display-device = '/dev/tty8'
    display-device = ''
    remote-host-name = ''
    is-local = TRUE
    on-since = '2012-10-22T18:17:55.553236Z'
    login-session-id = '4294967295'

Если никто не вошел в систему, не было никакого выхода. Я проверил, если кто-то вошел в систему с

ck_result" string => execresult("/usr/bin/ck-list-sessions | /bin/grep x11 | /usr/bin/cut --delimiter=\\' -f 2 | /usr/bin/wc -w

Это больше не работает, потому что lightdm greeter выглядит как зарегистрированный пользователь

Session12:
    unix-user = '[redacted]'
    realname = 'Light Display Manager'
    seat = 'Seat1'
    session-type = 'LoginWindow'
    active = TRUE
    x11-display = ':0'
    x11-display-device = '/dev/tty8'
    display-device = ''
    remote-host-name = ''
    is-local = TRUE
    on-since = '2012-10-22T22:17:55.553236Z'
    login-session-id = '4294967295'

Я думаю, я мог бы проверить тип сеанса, но я не знаю, как это сделать, и проверить x11-дисплей в одну строку. Затем мне нужно написать свой собственный сценарий, но в тот момент я подумал, что проверю, выполнил ли кто-нибудь еще работу или есть ли способ заставить ConsoleKit сказать мне, что я хочу (или я должен использовать другой инструмент)?

2 ответа

Так получилось, что мне просто нужно было решить эту проблему, но лучшее, что мне удалось сделать, это код "противного взлома":

dbus-send --system --type=method_call --print-reply=literal --dest=org.freedesktop.ConsoleKit `dbus-send --system --type=method_call --print-reply=literal --dest=org.freedesktop.ConsoleKit /org/freedesktop/ConsoleKit/Seat1 org.freedesktop.ConsoleKit.Seat.GetActiveSession` org.freedesktop.ConsoleKit.Session.GetX11Display | grep ":" &&  dbus-send --system --type=method_call --print-reply=literal --dest=org.freedesktop.ConsoleKit `dbus-send --system --type=method_call --print-reply=literal --dest=org.freedesktop.ConsoleKit /org/freedesktop/ConsoleKit/Seat1 org.freedesktop.ConsoleKit.Seat.GetActiveSession` org.freedesktop.ConsoleKit.Session.GetUnixUser | grep -v "uint32 122$" && echo "Active User"

Я полагаю, что использование lightdm одинаково во всех установках Ubuntu, но для других диспетчеров отображения это нужно будет отрегулировать.

Код проверяет:

  1. Есть ли на активном физическом сиденье дисплей X?
  2. Если да, соответствует ли его идентификатор 122 (lightdm)?
  3. В итоге вы получите вывод X display, user uid и сможете выполнить произвольный сценарий кода успеха echo "Active User",

Смотрите ответ на этот вопрос. Вы, вероятно, в конечном итоге будете использовать D-Bus и ConsoleKit.

Другие вопросы по тегам