Systemd

以 root 身份執行 systemctl –user 命令

  • October 19, 2021

我需要 root 才能管理systemctl --user單位。

現在我已經user1設置了 systemd 使用者單元。如果使用者直接通過終端、GUI 或 SSH 登錄,他們可以執行所有systemctl --user命令。

當使用者仍然登錄時,我可以以 root 身份執行以下systemctl --user命令並在該使用者處執行所有命令而沒有問題:

su - user1 -c "systemctl --user status myunit.service"

但是,如果使用者註銷,那麼任何人都不能systemctl --user以該使用者身份執行命令,甚至不能以 root 身份執行。我會繼續得到

Failed to connect to bus: No such file or directory

即使我sudo - user1作為root,那還不夠好,也會得到同樣的錯誤。使用者實際上需要登錄才能管理該使用者的單位。

顯然這是一個已知的“問題”(​​系統按設計執行時引用)。

**注意:**我嘗試在’s中設置XDG_RUNTIME_DIR環境變數,但這沒有幫助。user1``bashrc

另一個使用者似乎找到了解決方法,但它不起作用。看起來開發商不贊成他的想法

我發現的唯一解決方法是在使用公鑰進行身份驗證後通過 ssh 進入使用者帳戶以執行這樣的命令:

ssh user1@localhost -f 'systemctl --user status myunit.service'

我正在尋找一種不需要 SSH 連接的解決方法。我需要 root 才能在該使用者未登錄時管理 systemd 使用者單元。我怎樣才能做到這一點?

我實際上想出了一種非常乾淨的方法,它不涉及讓使用者實際登錄。需要為 root 使用者啟用帶有 loginctl 的 linger。

loginctl enable-linger user1

然後你可以檢查狀態

loginctl user-status user1

這應該列出使用者從他們的 systemd 程序執行的所有程序。現在我可以在沒有使用者實際登錄的情況下以 root 身份執行:

runuser -l user1 -c 'systemctl --user status myunit.service'

不要使用suor sudo,而是使用machinectl它會為您提供適當的使用者會話和上下文。

您可以像以前那樣從su/中放入一個外殼sudo

machinectl shell root@.host

…並在給定使用者的上下文中執行您想要執行的任何操作,或者您可以將要執行的 cmd 作為附加參數傳遞,例如:

machinectl shell root@.host $(which bash) -c "systemctl --user status myunit.service"

確保不要將 $(which bash) -c 嵌套在引號中。

引用自:https://unix.stackexchange.com/questions/671814