2011-06-27 54 views
4

我們假設這種情況:我們有一個用戶登錄,通過sudosu執行某個應用程序。該用戶已獲得dbus-daemon運行。
但是,當以root用戶權限運行的應用程序嘗試訪問D-Bus時,它只會產生另一個由root用戶擁有的dbus-daemon。這不是一個理想的情況。訪問另一個用戶的D-bus會話

有沒有辦法通過sudosu訪問運行應用程序的用戶的D-Bus會話?

+0

它應該工作,如果你從持有會話的用戶擁有'su -'到* root *,那麼另一個方向將不起作用,那是不想要的,並且會是一個很大的安全風險。 –

+0

的確,在這種情況下'dbus-monitor --system'幫助你嗎? – karlphillip

回答

5

首先,您需要DBUS_SESSION_BUS_ADDRESS環境變量在調用susudo的應用程序時被保留。不幸的是,這還不夠,因爲DBus總是檢查(作爲安全措施)調用進程和會話守護進程的UID是否相同。唯一的解決方法是在連接到會話總線之前,從此應用程序調用seteuid。您可以通過seteuid(0)重新獲得您的特權。

+0

很抱歉,如此晚的時候接受你的回答,我度過了假期。我甚至不需要'DBUS_SESSION_BUS_ADDRESS','seteuid'就夠了(至少我能夠在調用用戶的情況下與Zeitgeist交談)。謝謝! –

+0

但是,如果情況如此:我們有兩個用戶同時登錄(A,B)是否有可能連接到B的例如會話管理器從A? – Ojs

1

如果你在一個systemd發行,該relatively newmachinectl shell命令可以做的su/sudo的工作,它也將設置會話變量,如XDG_RUNTIME_DIRDBUS_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一起破解一些東西。