パスワードで保護された秘密鍵を使用する機能的なOpenVPNクライアント構成があります。
自分で実行すると、openvpn
パスワードの入力を求められ、クライアントが正常に起動します。
しかし、私がsystemctl
始まると、いいえパスワードの入力を求められ、サービスの初期化は完了しません。
systemd-ask-password
パスワードを待っているようですが、プロンプトは表示されません。
$ sudo systemctl start openvpn-myclient.service
$ systemctl status openvpn-myclient.service
● openvpn-myclient.service - OpenVPN instance ‘myclient’
...
Status: "Pre-connection initialization successful"
...
CGroup: /system.slice/openvpn-myclient.service
├─18997 openvpn --suppress-timestamps --config /path/to/client.conf
└─18998 /path/to/systemd-ask-password --icon network-vpn Enter Private Key Password:
パスワードの送信を求めるメッセージを手動で作成できます。
$ sudo systemd-tty-ask-password-agent --query
Enter Private Key Password: ************************
askpass /path/to/passphrase
client.confを入れて問題を解決することもできました。これはユーザー入力を必要としませんが、パスワードをプレーンテキストで保存する必要があります。
何が起こっているのか、プロンプトを表示するために何ができるのか、パスワードをプレーンテキストで入力しない方法を知りたいです。
どのようにさらにデバッグできますか?次のマニュアルページを読んでいますが、まだその内容を理解していません。
systemd-ask-password
systemd-tty-ask-password-agent
systemd-ask-password-wall.service
答え1
実験後systemctlはType=simple
。
Type=notify
サービス自体でsd_notifyを使用してデーモンが起動されたことをsystemdに通知すると機能します。sd_notify(3)
その後、プロセスが実行されている場合は、systemd-ask-password
プロンプトに表示する必要があります。
user@machine:~$ sudo systemctl start daemon-example
daemon-example *************
純粋なシェルPoCの例:
#!/bin/sh
export PW=$(systemd-ask-password "example:")
systemd-notify --ready # only if the service itself does not call `sd_notify`
echo "$PW" # for PoC
# dummy service, replace by `exec /usr/bin/my-service` otherwise
while true; do
sleep 10
done
# /etc/systemd/system/password-example.service
[Unit]
Description=example
[Service]
Type=notify
ExecStart=/tmp/example.sh
user@machine:~$ sudo systemctl start password-example.service
答え2
パラメータなしで「askpass」を使用すると機能します。