尝试从 www-data 运行的 bash 脚本写入文件时权限被拒绝

尝试从 www-data 运行的 bash 脚本写入文件时权限被拒绝

我在 /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-dataecho 10 | tee ttttecho 10 > tttt

另外,考虑一下使用printf而不是echo打印字符串。

相关内容