Как я должен определить, если пользователь вошел в систему графически во время работы 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, но для других диспетчеров отображения это нужно будет отрегулировать.
Код проверяет:
- Есть ли на активном физическом сиденье дисплей X?
- Если да, соответствует ли его идентификатор 122 (lightdm)?
- В итоге вы получите вывод X display, user uid и сможете выполнить произвольный сценарий кода успеха
echo "Active User",
Смотрите ответ на этот вопрос. Вы, вероятно, в конечном итоге будете использовать D-Bus и ConsoleKit.