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/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 *************

纯shell 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”应该可以。

相关内容