我有一个可用的 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”应该可以。