systemctl --user
デスクトップユーザーにとってはうまくいくようです。
dev@dev-VirtualBox:~$ systemctl --user > /dev/null
dev@dev-VirtualBox:~$ echo $?
0
しかし、www-dataユーザーとして同じコマンドを実行すると、予期しない応答がありました。
dev@dev-VirtualBox:~$ sudo su www-data -s /bin/bash
www-data@dev-VirtualBox:~$ systemctl --user > /dev/null
Failed to connect to bus: No such file or directory
www-data@dev-VirtualBox:~$ echo $?
1
ここでどのようにアクティブにしますかsystemctl --user
?
Ubuntu 16.04実行
答え1
これユーザーインスタンスごとsystemdはログインプロセス(PAM)のHookから始まり、pam_systemd
通常の仮想/実際の端末ログインとSSHなどを介したリモートログインに使用されます。
ログインしていません。 特権を強化しています。既存のログインセッションそしてsudo su www-data
。 (しかしこれは重複しています。スーパーユーザーとしてコマンドを実行することなくsudo -u www-data
すぐに開始されますwww-data
。)まだフックを呼び出していません。
したがって、www-data
systemdのユーザー固有のインスタンスはまだ起動されておらず、systemctl --user
会話したい項目が見つかりません。
手動で起動できます。
%sudo install -d -o www-data /run/user/`id -u www-data` % sudo systemctl start user@`id -u www-data`
(間違った順序で実行した場合は、サービスを停止して正しい順序で実行してください。間違った順序で実行すると、最終的に空のランタイムディレクトリが発生し、D-Busや他のソケットファイルがありませんが、サービスは実行中です。クライアントとは絶対に通信しませんではありません)。
1つのトリッキーなことは、別のアカウントの権限でデスクトップバスクライアントプログラムを実行するときに別のアカウントのデスクトップバスエージェントと通信できるDBUS_SESSION_BUS_ADDRESS
ように変数を変更する必要があることです。systemctl
% sudo -u www-data DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/`id -u www-data`/bus systemctl --user
これが簡単な方法です。より洗練されたアプローチは、フックがsudo
呼び出されるようにPAM設定を調整することですpam_systemd
。ただし、XDG_RUNTIME_DIR
特に環境変数に関して望ましくない副作用がある可能性があります。発生した効果に耐えることができると確信している場合にのみ、このpam_systemd
回避策を試してくださいsudo
。
追加読書
- ジョナサンデボインポラード(2014)。ユーザー権限を削除するためにsuを乱用しないでください。。一般的な答え。
- Lennart Petlinget al。 (2017).
pam_systemd
。システムマニュアルページ。 freedesktop.org.
答え2
それで、ついに失われたパズルのピースを見つけました。 @JdeBPの優れたヒントのおかげで、次のことがわかりました。
- systemd --userがwww-dataのために実行されています。
- UbuntuではDBUS_SESSION_BUS_ADRESSが無視されるようです。
- XDG_RUNTIME_DIR が設定されていません。
"/run/user/$UID"をエクスポートするようにXDG_RUNTIME_DIRを設定することで問題が解決しました。
予想される動作を得るために従う必要があるステップは次のとおりです。
% sudo loginctl enable-linger www-data # Enable systemd --user service to start at boot
% XDG_RUNTIME_DIR="/run/user/$UID" systemctl --user # Access services as www-data without actually logging in
答え3
これは非常に醜い解決策です。
言ったように、質問は次のとおりです。
ログインしていません。既存のログインセッションの権限を強化しています[...]
だから「ただ」ログインしてください...
サーバーにいる場合は、端末を使用する必要があります。 同じ質問をする必要があります。しかし、ついに発見しました。解決策はとても簡単です。次のコマンドを実行してユーザーに切り替えます(各ユーザーで適切なシェルを実行します)。
$ sudo machinectl shell --uid www-data
sudo loginctl enable-linger www-data
ブート時に実行されるようにサービスなどを開始したい場合でも、それはまだ便利です。それ以外の場合は、そのユーザーが「ログイン」されている場合にのみ実行されます。
答え4
で述べたようにここにコメントがあります。systemctl
、ユーザーとして実行できる関連Ubuntuパッケージが見つからない可能性があります。私に起こったことです。修理する:
apt install libpam-systemd
実行できる必要があるユーザーとしてSSHを介して再度ログインします
systemctl --user
。したがって、rootで実行しないでください。
これで、echo $XDG_RUNTIME_DIR
追加の手順なしで動作し、次のように表示されます。
$ echo $XDG_RUNTIME_DIR
/run/user/1012
Ubuntu 18.04 LTSがリリースされました。