VPNはsystemd-ask-passwordプロンプトを表示しません。

VPNはsystemd-ask-passwordプロンプトを表示しません。

パスワードで保護された秘密鍵を使用する機能的な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/passphraseclient.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」を使用すると機能します。

関連情報