删除Web目录以外的文件


Delete files outside of Web dir?

如何删除web目录外的文件?它不会删除文件。

脚本将通过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

PHP脚本通常以非root用户身份运行,因为它们通常由httpd执行。因为你的文件被设置为只有root用户才有写权限,所以这是行不通的。

如果您不能永久地更改文件的所有权或写入权限,您可以考虑编写一个非常短的脚本,并使用更高的权限(使用sudo或suid位)执行它,而不是在PHP上调用unlink()

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

delete-file.pl:

#!/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 ];

确保该文件为root (chown root delete-file.pl)所有,然后运行chmod 6711 delete-file.pl来设置其SUID位。在此之后,文件将始终以root身份执行。

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

(注意,这里我专门使用Perl,因为Bash通常会忽略suid位。)

如果您觉得使用sudo更舒服,那么只需编写一个类似于上面描述的脚本(Bash也可以工作)并将其添加到/etc/sudoers。然后,您可以执行以下操作:exec( "/usr/bin/sudo /path/to/delete-file-script $filename" );以提升的权限运行脚本。

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

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

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

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

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

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

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