OpenVPN client-connect脚本读取/var/log/syslog遇权限拒绝问题排查
碰到这种权限问题,核心往往是脚本的执行上下文和你手动运行时不一样——毕竟client-connect脚本是OpenVPN进程触发的,不是你用myuser账号手动启动的,咱们一步步来排查:
1. 先搞清楚OpenVPN实际用哪个用户运行脚本
OpenVPN默认会以openvpn用户(或root,取决于你的配置)来执行client-connect脚本,而不是你的myuser账号。你可以先确认一下:
ps aux | grep openvpn
如果输出里显示是openvpn用户在跑进程,那问题就很明显了:即使你的myuser在adm组,脚本实际是用openvpn用户执行的,这个用户可能没权限读/var/log/syslog。
解决办法:把OpenVPN运行用户加入adm组(这样它就能读取syslog了):
sudo usermod -aG adm openvpn
之后重启OpenVPN服务生效:
sudo systemctl restart openvpn@your-server-config
2. 你的sudo配置逻辑搞反了
你在sudoers里加的myuser ALL=(ALL) NOPASSWD: /etc/openvpn/myscript.sh,意思是myuser可以免密用sudo跑这个脚本,但脚本里写的是sudo -u myuser tail...——这相当于让OpenVPN运行用户(比如openvpn)去sudo切换到myuser,而你并没有给openvpn用户这个sudo权限,所以这条命令肯定会失败。
其实完全没必要在脚本里嵌套sudo,直接去掉sudo -u myuser,改成:
LAST_LINE=$(tail -n 50 /var/log/syslog | grep -m 1 "Peer Connection Initiated")
只要OpenVPN运行用户有读syslog的权限(比如加入adm组后),这条命令就能正常执行。
3. 检查syslog的额外权限限制(ACL)
有时候单纯的文件权限没问题,但系统可能用ACL做了额外限制,你可以用getfacl看看:
getfacl /var/log/syslog
如果输出里没有OpenVPN运行用户(比如openvpn)的读权限,可以手动加上:
sudo setfacl -m u:openvpn:r /var/log/syslog
4. 手动模拟脚本执行场景排查
为了确认问题点,你可以模拟OpenVPN用户来执行脚本,看看具体报错:
sudo -u openvpn /etc/openvpn/myscript.sh
然后查看syslog里的logger输出(比如你脚本里的logger "Last Line Contents --> $LAST_LINE"),或者直接看终端有没有权限拒绝的提示,这样能精准定位问题。
给你脚本的小优化建议
去掉多余的sudo后,脚本里的sendEmail函数可以简化一点,另外可以加个错误判断,避免后续空值报错:
sendEmail() { logger "Starting email send.." # 直接读取syslog,不需要sudo LAST_LINE=$(tail -n 50 /var/log/syslog | grep -m 1 "Peer Connection Initiated") logger "Outside the if" logger "Last Line Contents --> $LAST_LINE" # 先检查LAST_LINE是否为空,避免后续报错 if [ -z "$LAST_LINE" ]; then logger "Error: Failed to read syslog or no 'Peer Connection Initiated' line found" return 1 fi if echo "$LAST_LINE" | grep -q "Peer Connection Initiated"; then logger "Inside the if" IP=$(echo "$LAST_LINE" | cut -d "]" -f4 | cut -d ":" -f1) PROFILE=$(echo "$LAST_LINE" | cut -d "]" -f2 | cut -d "[" -f2) BODY0="$BODY1$PROFILE$BODY2$IP$BODY3" msmtp -a default $TO_ADDRESS <<EOF From: $FROM_ADDRESS To: $TO_ADDRESS Subject: $SUBJECT $BODY0 EOF fi }
备注:内容来源于stack exchange,提问作者beekeeper

