我正在尝试通过 php 运行 shell 脚本,但遇到权限错误,但是我正在尝试向我的 www-data 用户添加权限,以便在没有密码的情况下使用 sudo 命令,但它不起作用,我不这样做不知道我是否举报有误。以下是我的“visudo”文件的编辑方式。
www-data ALL=(ALL) NOPASSWD:/var/www/mysite/classes/builder-sites-nginx.sh
www-data ALL=(ALL) NOPASSWD:/var/www/mysite/classes/MyClassToCallScript.php
我的 PHP 代码是:
$command = "sudo sh ".dirname(__FILE__)."/builder-sites-nginx.sh {$domain}";
// dump($command);
$response = shell_exec($command);
我的代码外壳:
#!/bin/bash
FILE_FROM=/etc/nginx/sites-available/sites-builders
FILE_TO=/etc/nginx/sites-enabled/"$1"
[ ! -d "$FILE_FROM" ] && mkdir -p "$FILE_FROM"
if test -f "$FILE_TO"; then
echo "syntax is ok. $FILE_TO already exists"
else
ln -s "$FILE_FROM/$1" /etc/nginx/sites-enabled/
#check stats
if nginx -t > /dev/null 2>&1; then
echo "syntax is ok"
service nginx reload
else
echo "syntax is not ok"
rm "$FILE_TO"
fi
fi
但我的回答是“空”。我通过将以下摘录添加到我的“visudo”中进行了测试
www-data ALL=(ALL) NOPASSWD:ALL
使用我上面提到的方式是可行的,但我相信我的网站的安全性会受到威胁,对吗?为什么我的 apache 用户将拥有 sudo 权限,如果有人放入一些恶意文件,我就会遇到麻烦,所以我带着最初的问题回来,我在执行给定脚本时放置“visudo”路径的方式是正确的?
答案1
你没有运行sudo /var/www/mysite/classes/builder-sites-nginx.sh
,你正在运行sudo sh /var/www/mysite/classes/builder-sites-nginx.sh
- 并且sudo
没有配置为允许 www-data 运行sudo sh
(也不应该这样 - 这将是一个巨大的安全漏洞,相当于www-data ALL=(ALL) NOPASSWD:ALL
)。
使用 使/var/www/mysite/classes/builder-sites-nginx.sh
可执行文件成为可执行文件chmod +x
,并确保它#!/bin/bash
作为第一行(#!/bin/sh
也可以工作,因为您的脚本不使用任何仅限 bash 的功能)。
然后将 PHP 代码修改为:
$command = "sudo ".dirname(__FILE__)."/builder-sites-nginx.sh {$domain}";
顺便说一句,根据$domain
定义的位置和方式(即,如果它来自用户提供的数据),您可能需要使用 PHP 的escapeshellcmd()
函数来清理它。