Linux

從 shell 為使用者啟動 systemd 使用者實例

  • March 26, 2021

我在我的系統上為另一個使用者啟動了一個 shell。但是,該使用者沒有 systemd 使用者實例:

helloer@host $ sudo -u testusr bash
testusr@host $ systemctl --user status
Failed to connect to bus: $DBUS_SESSION_BUS_ADDRESS and $XDG_RUNTIME_DIR not defined (consider using --machine=<user>@.host --user to connect to bus of other user)

如何為 testusr 啟動 dbus 或 systemd 使用者實例?

我正在執行 Arch Linux、linux 5.11.8.arch1-1、dbus 1.12.20-1、systemd 247.4-2。

如果你想為另一個使用者做 systemd 的事情,最簡單的事情就是以那個使用者的身份登錄,例如使用ssh user@localhost,但這裡是讓使用者切片執行 bash 的最小設置替代方案:

otheruser=testusr
id=$(id -u $otheruser)
sudo mkdir -p /run/user/$id
sudo chown $otheruser /run/user/$id
sudo systemctl start user@$id
sudo -u $otheruser \
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$id/bus \
systemd-run --user --scope /bin/bash

根據systemd 開發人員

“su” 是一種用於臨時更改使用者身份和極少數其他程序憑據的工具。它不是打開全新登錄會話的工具。一個新的登錄會話具有非常明確的原始設置,不從任何其他會話繼承任何內容,但對於“su”uid 更改實際上並非如此:大多數執行環境都是繼承的,在眾多且不明顯方式,例如 MAC 上下文、審計上下文、cgroup 上下文、命名空間上下文、調度、計時器粒度、

您需要通過 TTY、顯示管理器以您的使用者身份登錄,machinectl login或者ssh獲得一個足夠乾淨的會話以執行 systemd 使用者匯流排。

如果這些對您的使用者都沒有意義,那麼您的使用者可能是系統使用者(不用於登錄)。在這種情況下,請考慮User=在您的服務中使用,而不是嘗試在使用者匯流排上執行它。

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