执行php文件时将字符串写入只有root可以访问的文件

执行php文件时将字符串写入只有root可以访问的文件

我有一个案例,要求我将一些字符串写入只能执行此操作的文件中root。我正在尝试一些基于此的解决方案邮政但它们都不起作用。

案件: 当用户成功完成后,他会自动访问包含可以写入只有访问权限的writefile.php文件()的脚本。tes.txtroot

我使用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

经过多次尝试,也阅读了一些相关文章。最后我明白了,问题出在我的安排上。希望这可以帮助其他刚接触sudon的用户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_execexec来执行writefile.phpsudo命令。结构如下:

索引.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 问题,因为根据其设置,可能不允许从该位置运行文件。

相关内容