Доступ к сеансу D-Bus другого пользователя - PullRequest
5 голосов
/ 27 июня 2011

Давайте предположим, что такая ситуация: у нас есть один зарегистрированный пользователь, который выполняет какое-то приложение через sudo или su.У этого пользователя запущено dbus-daemon.
Однако, когда приложение, работающее с привилегиями root, пытается получить доступ к D-Bus, оно просто порождает другое dbus-daemon, принадлежащее пользователю root.Это нежелательная ситуация.

Есть ли способ получить доступ к сеансу D-Bus для пользователя, который запускал приложение через sudo или su?

Ответы [ 2 ]

5 голосов
/ 18 июля 2011

Во-первых, вам нужно сохранить переменную окружения DBUS_SESSION_BUS_ADDRESS при вызове приложения с su или sudo. К сожалению, этого недостаточно, потому что DBus всегда проверяет (в качестве меры безопасности), совпадают ли идентификаторы UID вызывающего процесса и демона сеанса. Единственный обходной путь - вызвать seteuid из этого приложения перед подключением к сеансовой шине. Затем вы можете восстановить свои привилегии с помощью seteuid(0).

2 голосов
/ 26 апреля 2016

Если вы находитесь в системном дистрибутиве, команда относительно новая machinectl shell может выполнять работу su / sudo, а также устанавливать переменные сеанса, такие как XDG_RUNTIME_DIR иDBUS_SESSION_BUS_ADDRESS.Так, например, если я хочу запустить systemctl --user как пользователь test, нормальный подход не удастся:

$ sudo --user=test systemctl --user
Failed to connect to bus: No such file or directory

Но этот способ работает:

$ sudo machinectl shell --uid=test .host -- /usr/bin/systemctl --user

Если вам нужночтобы "вернуться назад" в пользовательский сеанс, который вызвал сценарий sudo, вы можете использовать SUDO_USER / SUDO_UID, чтобы взломать что-то вместе.

...