如何解决RockyLinux 9.2中NetworkManager-dispatcher脚本执行systemctl时的权限拒绝错误?
如何解决RockyLinux 9.2中NetworkManager-dispatcher脚本执行systemctl时的权限拒绝错误?
嗨,我之前在Rocky9上遇到过一模一样的问题,本质是RHEL9系系统对NetworkManager调度脚本的运行环境做了严格的权限隔离,哪怕脚本本身是root权限,直接调用systemctl也会被拦下来。咱们一步步来搞定它:
首先得理清原因:Rocky9的nm-dispatcher.service启用了systemd的安全隔离机制(比如ProtectSystem、PrivateTmp这类限制),再加上SELinux的强制管控,导致脚本里的systemctl命令没办法正常执行——这就是你看到"Permission denied"或者"command not found"的根源。
下面是几种亲测有效的解决方法,你可以选最适合你的:
方法一:用sudo免密执行指定命令
虽然root用户用sudo看起来有点奇怪,但这里可以借助sudo的运行环境绕过nm-dispatcher的权限限制:
- 先编辑sudoers文件(一定要用
visudo,避免语法错误导致sudo失效):sudo visudo - 在文件末尾添加这一行,允许root免密执行重启zerotier-one的命令:
root ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart zerotier-one.service - 修改你的脚本,把原来的重启命令替换成:
/usr/bin/sudo /usr/bin/systemctl restart zerotier-one.service
方法二:用systemd-run创建临时服务执行命令
systemd-run可以帮你在不受限的环境里执行命令,完美绕过nm-dispatcher的隔离:
直接把脚本里的重启命令改成下面这行就行:
/usr/bin/systemd-run --user=root --service-type=oneshot /usr/bin/systemctl restart zerotier-one.service
方法三:调整SELinux策略(如果是SELinux导致的)
如果上面两种方法没用,大概率是SELinux在拦着你。你可以先查一下SELinux的拒绝日志确认:
sudo ausearch -m avc -ts recent
如果看到和nm-dispatcher、systemctl相关的拒绝记录,就按下面步骤添加自定义规则:
- 先安装工具包:
sudo dnf install policycoreutils-python-utils - 生成并加载允许规则:
sudo ausearch -m avc -ts recent | sudo audit2allow -M nm-dispatcher-systemctl sudo semodule -i nm-dispatcher-systemctl.pp
最后,别忘了确保你的脚本权限和SELinux上下文是正确的:
sudo chmod 755 /etc/NetworkManager/dispatcher.d/10-restart-network-services.sh sudo restorecon /etc/NetworkManager/dispatcher.d/10-restart-network-services.sh
重启NetworkManager服务后再测试插拔网线:
sudo systemctl restart NetworkManager
这样应该就能解决权限拒绝的问题了!
备注:内容来源于stack exchange,提问作者hpy
相关产品推荐
相关产品推荐

