【发布时间】:2018-10-08 12:02:40
【问题描述】:
我正在尝试在用户提交表单时创建一个文件,使用exec("sudo touch a.cpp") or die("Unable to create file)";
输出:无法创建文件
我已经检查了以下答案:
1:sudo in php exec()
2:https://askubuntu.com/questions/139723/sudo-does-not-ask-for-password/139733#139733
3:https://askubuntu.com/questions/810462/nopasswd-option-not-working-in-sudo?noredirect=1&lq=1
4:也试过exec("echo <password> | sudo -S touch a.cpp");
在visudo 中添加了www-data ALL=(ALL) NOPASSWD: /var/www/html/<project-folder>
似乎没有任何效果。
更新:正如@Rolfie 在评论中提到的,使用 fopen() 解决了这个问题,但我仍然无法使用 exec() 使用任何命令,例如再次编译文件会显示相同的错误。
【问题讨论】:
-
我认为你不应该在 exec() 函数中使用 sudo。只需确保该目录属于 php 使用的同一用户。并确保它有被编辑的权利。
-
我认为您应该使用 fopen() 而不是 exec() 创建文件。再次,目录的权利应该是正确的。 chmod 并将 linux 中的目录 chown 给正确的用户。
-
@Rolfie 使用
exec('fopen("a.cpp", "w")') or die("Unable to create file!");也不起作用,文件有权编辑,但有办法检查和更改吗? -
fopen() 是一个 php 函数,而不是一个 linux 函数。所以不需要exec。只需 fopen("a.cpp", "w");检查php.net/manual/en/function.fopen.php。
-
touch() 也是一个 php 函数,请查看 php.net/manual/en/function.touch.php 。这也应该做你想做的事。 fopen 主要用于当您想在文件中写入内容时使用,例如 txt 文件。所以maby touch() 对你来说是更好的选择。
标签: php