我在 /var/www/html/exe 中有一个 bash 脚本。此文件夹归 www-data:www-data 所有。
PHP 代码调用此脚本,以 www-data 身份运行。我使用以下方式测试它sudo -u www-data script.sh
sudo tee:当我尝试从脚本写入文件时,权限被拒绝,例如作为测试:
echo 10 | sudo tee tttt
它提示输入 www-data sudo 密码。这不起作用。
临时文件:我也尝试将临时文件写入 /home/ubuntu 文件夹,但权限也被拒绝
Nopasswd:我显然还可以在 sudoers 文件中添加 www-data,这样就不需要密码了。这很糟糕,因为它需要额外的自定义设置。部署是自动化的,这增加了部署代码的复杂性。
Shell:我尝试了在不同的 shell 中运行的各种组合,例如$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"
这些导致提示输入 www-data sudo 密码,无法工作。
Sudo:我认为我不应该(也不想)以 sudo 身份运行 shell。此外,这是一项服务,需要更改不属于我的代码。
人工干预:我发现很多答案都建议“以 root 身份登录”。没有人可以做这件事:代码会自动构建并部署到多个环境中。
黑客解决方法:编写一个 cpp exe,用于写入文件并从脚本中调用它。我可以通过这种方式毫无问题地写入文件。但这感觉很糟糕,并且增加了构建/部署的复杂性。
在阅读了数十页有关 Linux 如何处理权限和 shell 的文章后,我仍然不确定我是否完全理解了 shell 和子 shell 如何与权限交互。我怀疑有一种方法可以做到这一点,但是怎么做呢?
答案1
如果以用户身份运行的脚本www-data
运行命令echo 10 | sudo tee tttt
,则用户www-data
通过请求 root 权限sudo
,这可能是不允许的。
由于脚本本身以用户身份运行,www-data
并且您想要写入该用户拥有的目录,因此无需sudo
:写入操作(命令)也tee
将以用户的权限运行。因此您需要的是,或者只是。www-data
echo 10 | tee tttt
echo 10 > tttt
另外,考虑一下使用printf
而不是echo
打印字符串。