我們假設這種情況:我們有一個用戶登錄,通過sudo
或su
執行某個應用程序。該用戶已獲得dbus-daemon
運行。
但是,當以root用戶權限運行的應用程序嘗試訪問D-Bus時,它只會產生另一個由root用戶擁有的dbus-daemon
。這不是一個理想的情況。訪問另一個用戶的D-bus會話
有沒有辦法通過sudo
或su
訪問運行應用程序的用戶的D-Bus會話?
我們假設這種情況:我們有一個用戶登錄,通過sudo
或su
執行某個應用程序。該用戶已獲得dbus-daemon
運行。
但是,當以root用戶權限運行的應用程序嘗試訪問D-Bus時,它只會產生另一個由root用戶擁有的dbus-daemon
。這不是一個理想的情況。訪問另一個用戶的D-bus會話
有沒有辦法通過sudo
或su
訪問運行應用程序的用戶的D-Bus會話?
首先,您需要DBUS_SESSION_BUS_ADDRESS
環境變量在調用su
或sudo
的應用程序時被保留。不幸的是,這還不夠,因爲DBus總是檢查(作爲安全措施)調用進程和會話守護進程的UID是否相同。唯一的解決方法是在連接到會話總線之前,從此應用程序調用seteuid
。您可以通過seteuid(0)
重新獲得您的特權。
很抱歉,如此晚的時候接受你的回答,我度過了假期。我甚至不需要'DBUS_SESSION_BUS_ADDRESS','seteuid'就夠了(至少我能夠在調用用戶的情況下與Zeitgeist交談)。謝謝! –
但是,如果情況如此:我們有兩個用戶同時登錄(A,B)是否有可能連接到B的例如會話管理器從A? – Ojs
如果你在一個systemd發行,該relatively newmachinectl 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
一起破解一些東西。
它應該工作,如果你從持有會話的用戶擁有'su -'到* root *,那麼另一個方向將不起作用,那是不想要的,並且會是一個很大的安全風險。 –
的確,在這種情況下'dbus-monitor --system'幫助你嗎? – karlphillip