あるユーザー(またはルート)が別のユーザーのユーザーレベルのシステムサービスを制御できますか?
私はこれを試しましたが、sudo -u <some user> systemctl --user restart <some service>
dbus:について文句を言いますFailed to get D-Bus connection: Connection refused
。
答え1
SSH経由でリモートでGentooボックスにログインしたときも同じ問題に直面しました。私の場合は、不足しているXDG_RUNTIME_DIR
環境変数が原因でした。DBUS_SESSION_BUS_ADDRESS
次のコマンドを実行して再試行してください。
export XDG_RUNTIME_DIR="/run/user/$UID"
export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"
役に立つ場合は、これらのコマンドを.bashrcに入れることができます。 .bashrcよりもエレガントなソリューションが必要だと思いますが、これはディストリビューションによって異なります。
編集する:
rootとしてログインした後、次のようにsystemctl --user
他のユーザーとして正常に実行しましたsu
。
su -c 'XDG_RUNTIME_DIR="/run/user/$UID" DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus" systemctl --user status' username
または、以下を使用しますsudo
(注意して、そのユーザーUID(1000)を「/run/user/」パスに明示的に追加する必要がありましたが、bashスクリプトで実行している場合は$ SUDO_UIDを代わりに使用できます)。
sudo -u username XDG_RUNTIME_DIR="/run/user/1000" DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus" systemctl --user status
答え2
システム248-M username@
(2021年3月リリース)他のユーザーを指定するための構文サポートが導入されました。
別のユーザー名が次のようになっているとします。テストユーザーサービスはfoobar.service、今実行できます
sudo systemctl -M testuser@ --user restart foobar.service
答え3
仮想のsomeuser
使用強く打つログインシェルとして以下を追加します。出口到着~someuser/.bashrc
:
export XDG_RUNTIME_DIR="/run/user/$UID"
export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"
その後、ルート/Sudosomeuser
次のようにコマンドをラップして、権限をsystemdと対話することができますrunuser
。
sudo runuser -l someuser -c "systemctl --user restart some-template@$some-service.service"
答え4
Failed to connect to bus: No such file or directory
Ubuntu 20.04()で次のコマンドを実行すると同じエラーが発生しました。
systemctl --user mask tracker-store.service tracker-miner-fs.service tracker-miner-rss.service tracker-extract.service tracker-miner-apps.service tracker-writeback.service
問題はエイリアシングによって発生します。
alias systemctl='sudo systemctl'
systemctl
sudoと交換するとsudo systemctl
エラーが発生しました。
環境変数:
export XDG_RUNTIME_DIR="/run/user/$UID"
export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"
ので使用されませんsudo
。
mkaito
に書く上記のコメント:
sudoは基本的に環境を消去するので、これらのホワイトリストが必要だと思います。