这不是很优雅,但请尝试 ssh 而不是 sudo。
您是否曾经注意到,您在 CLI 上尝试以管理员身份运行的命令从未遇到过 SELinux 问题?它总是通过 cron/systemd 开始执行,或者从 http 连接开始执行.....
那么 sshd 和由它启动的 shell 基本上被排除在 selinux 强制执行之外,您可以在这里使用它来为您带来好处。
首先阅读 ssh 密钥和命令锁定密钥。
然后为这个命令创建一个新的密钥对:
ssh-keygen -f id_rsa_commandyouwant -P ''
在用户的 authkeys 文件中安装该密钥对:
echo -n 'command="/path/to/your/script",no-port-forwarding,no-x11-forwarding,no-agent-forwarding' >> /root/.ssh/authorized_keys
cat id_rsa_commandyouwant**.pub** >> /root/.ssh/authorized_keys
我们在上面回显的单引号中的字符串将锁定密钥,因此它不能用于获取交互式 shell。当该密钥与该用户帐户一起使用时,只会执行脚本。
如果您的脚本需要接收参数,您可以在脚本中使用 ${SSH_ORIGINAL_COMMAND} 变量(仔细清理)。只需在调用 ssh 客户端时提供参数,就好像它们是命令一样,整个 cmdline 字符串将显示在 ${SSH_ORIGINAL_COMMAND} 中。
无论如何,如果您的脚本可以以非 root 身份运行,请这样做,并替换上面的 root 的 homedir。
所以,而不是:
exec("sudo /sbin/ufw {命令}")
尝试:
exec("ssh -i /path/to/id_rsa_specialusecase root@localhost {command}")
并制作一个脚本,我将调用 /path/to/your/script 读取 ${SSH_ORIGINAL_COMMAND},验证它是理智和安全的(不包含 ; rm -rf /),然后调用:
/sbin/ufw ${SSH_ORIGINAL_COMMAND}
快乐的系统管理!