每次客户端连接时,我都会尝试在 openvpn 服务器上执行命令。我有一个使用以下方式创建的用户 openvpn
adduser --system --shell /usr/sbin/nologin --no-create-home openvpn
groupadd openvpn
usermod -g openvpn openvpn
该用户用于我的服务器配置(并且您还会看到我想要在每个客户端连接时执行的命令):
... <parts omitted>
user openvpn
group openvpn
client-connect '/bin/bash -c "sudo /usr/local/psa/bin/dns -a my.domain -a $common_name -ip $ifconfig_pool_remote_ip"'
script-security 2
我还通过 visudo (openvpn ALL=NOPASSWD: /usr/local/psa/bin/dns) 添加了一条条目,以便使用 sudo 使该脚本可供 openvpn 执行。服务器启动时没有错误,但如果客户端(在此日志中名为 server03)连接,则脚本会失败并显示以下日志:
sudo[31369]: openvpn : TTY=unknown ; PWD=/etc/openvpn ; USER=root ; COMMAND=/usr/local/psa/bin/dns -a my.domain -a server03 -ip 10.9.0.2
sudo[31369]: pam_unix(sudo:session): session opened for user root by (uid=0)
sudo[31369]: pam_unix(sudo:session): session closed for user root
ovpn-user-server[31357]: server03/87.XXX.XXX.4:40594 WARNING: Failed running command (--client-connect): external program exited with error status: 1
正如您在日志中看到的那样,该命令使用正确的变量执行,但不知何故失败了。但如果我从 CMD 执行该命令(以 root 身份),它会成功终止,如果我通过以下方式登录 openvpn-user
su -s /bin/bash openvpn
脚本也成功终止。日志:
openvpn@...:/etc/openvpn$ sudo /usr/local/psa/bin/dns -a my.domain -a server03 -ip 10.9.0.2
SUCCESS: Creation of DNS record in Domain 'my.domain' complete.
我究竟做错了什么?
答案1
Sudo 默认需要 TTY。手动运行脚本后,TTY 可用。在 cron 中或(我猜也是)通过 openvpn 作为调用脚本运行后,没有可用的 TTY。
我看到两个选项:
- 尝试重写脚本以不需要 root / sudo(例如带有 TSIG 的 nsupdate)
更改 sudo 的配置以不需要 tty为什么 cron 在我的脚本中默默地无法运行 sudo 内容?(@stackexchange):
#Defaults requiretty #Defaults !visiblepw