删除Web目录以外的文件?

时间:2013-03-13 17:38:42

标签: php linux chmod delete-file

删除web目录以外的文件的解决方案是什么?它不会删除文件。

将通过网络浏览器(仅限管理员)访问脚本。

例如:

PHP位于:/var/www/html/delete_xx_phones.php

-rwxr-xr-x 1 root root  592 Mar 13 17:18 delete_xx_phones.php

delete_xx_phones.php代码看起来像这样:

 foreach(glob("/path/004*-phone.cf") as $file) { 
    unlink($file); 
  }

/path

中的文件
-rw-r--r--  1 root root      346 Mar 13 17:15 004aaaa-phone.cf
-rw-r--r--  1 root root      346 Mar 13 17:15 004bbaa-phone.cf

2 个答案:

答案 0 :(得分:1)

PHP无法访问这些文件,因为它们属于root用户。 PHP通常与Web服务器的用户ID一样运行,或者如果它在命令行上运行,则在调用php的用户的上下文中运行。

理论上,您可以在PHP脚本中执行sudo来强制删除这些文件,但这是非常糟糕的做法 - 您必须将root密码存储在PHP脚本中。

更好的方法是将文件的所有者更改为PHP运行的用户,或者chmod,以便PHP可以删除它们(虽然这也不是很优雅,因为你可以使文件可访问机器上的每个用户。)

根据您的具体情况,每隔几分钟在cron帐户下运行的root脚本会更改这些文件的所有者,这可能是一个可行的解决方案:

chown apache:apache /path/004*-phone.cf 

(用您的PHP用户和/或组替换apache:apache

当然,如果您可以影响这些文件的创建方式,那么将它们作为正确用户的属性将是理想的。

答案 1 :(得分:1)

PHP脚本通常以root用户身份运行,因为它们通常由httpd执行。由于您的文件设置为仅对root用户具有写入权限,因此无法解决问题。

如果您无法永久更改文件的所有权或写入权限,则可以考虑编写一个非常短的脚本并使用提升的权限(使用sudo或suid位)执行它而不是调用{{1}在PHP上。

对于suid方法,在Perl中编写一个简单的脚本(可能需要安装perl-suidperl包),删除作为参数传递的文件名:

<强> delete-file.pl:

unlink()

确保该文件归root(#!/usr/bin/perl -wT # This is VERY insecure, so if you use it, make sure you modify it # to filter the filenames before putting the script on production # machines unlink $ARGV[ 0 ]; )所有,然后运行chown root delete-file.pl以设置其SUID位。之后,文件将始终以root身份执行。

然后在PHP脚本中,您只需运行chmod 6711 delete-file.pl(考虑exec( "/path/delete-file.pl $filename" )以确保安全),您的文件应该开始删除。

(注意我在这里专门使用Perl,因为Bash传统上忽略了suid位。)

如果您对使用shellescapearg()感觉更舒服,那么只需编写类似于上述内容的脚本(Bash也可以使用),然后将其添加到sudo。然后,您可以执行以下操作:/etc/sudoers以使用提升的权限运行脚本。