You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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的权限限制:

  1. 先编辑sudoers文件(一定要用visudo,避免语法错误导致sudo失效):
    sudo visudo
    
  2. 在文件末尾添加这一行,允许root免密执行重启zerotier-one的命令:
    root ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart zerotier-one.service
    
  3. 修改你的脚本,把原来的重启命令替换成:
    /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相关的拒绝记录,就按下面步骤添加自定义规则:

  1. 先安装工具包:
    sudo dnf install policycoreutils-python-utils
    
  2. 生成并加载允许规则:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 11:05:27