我有一个案例,要求我将一些字符串写入只能执行此操作的文件中root
。我正在尝试一些基于此的解决方案邮政但它们都不起作用。
案件:
当用户成功完成后,他会自动访问包含可以写入只有访问权限的writefile.php
文件()的脚本。tes.txt
root
我使用visudo
并将其添加到我的sudoers
文件中:
username ALL=(root) NOPASSWD: /var/www/html/myprogram/writefile.php
不行!
username ALL=(ALL) NOPASSWD: /var/www/html/myprogram/writefile.php
不行!
我的简单代码在writefile.php
<?php
echo file_put_contents("tes.txt","Hello World. Testing!");
?>
结果:
Warning: file_put_contents(tes.txt): failed to open stream: Permission denied
答案1
经过多次尝试,也阅读了一些相关文章。最后我明白了,问题出在我的安排上。希望这可以帮助其他刚接触sudo
n的用户visudo
。
问题:
1. 用户名
关于username
,我添加的用户是通过终端有登录权限的用户。即使该应用程序是通过网站访问的。所以用户应该是www-data
,看起来像:
www-data ALL=(root) NOPASSWD: /usr/bin/php /var/www/html/myprogram/writefile.php
2.不使用exec或shell_exec
我忘记了writefile.php
不应该通过浏览器直接访问。必须通过另一个文件 ( index.php
),然后在该文件中必须使用shell_exec
或exec
来执行writefile.php
该sudo
命令。结构如下:
索引.php
<?php
exec("sudo /usr/bin/php /var/www/html/myprogram/writefile.php");
?>
写文件.php
<?php
echo file_put_contents("tes.txt","tes write file");
?>
终于打开tes.txt
并且工作正常了!谢谢大家。
答案2
这看起来像是对 sudo 工作原理的误解。只是在 sudoers 文件中放入一些内容不会导致文件的权限发生实际更改,该文件必须按以下方式运行: sudo php /var/www/html/myprogram/writefile.php by the "username".. 您也可以遇到 SELinux 问题,因为根据其设置,可能不允许从该位置运行文件。