2013-03-13 121 views
0

删除web dir以外的文件的解决方案是什么?它不会删除这些文件。删除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 
+1

PHP不关心web-dir,但不太可能以'root'身份运行,因此它可能没有足够的权限。 – jeroen 2013-03-13 17:39:37

+2

您的脚本可能没有删除文件的权限 - 它们属于'root'。没有简单的解决方法 - 你的真实世界的情况是什么,为什么你需要用脚本来做到这一点? – 2013-03-13 17:39:41

+0

@皮卡웃因为每个VoIP电话都有一个MAC地址。这些文件存储在'tftpboot'目录中 - 如果'tftpboot'目录中存在文件,它将允许手机注册。当我在Linux控制台上手动创建/删除文件时它可以工作。我正在寻找解决方案,通过网页浏览器使用PHP – 2013-03-13 17:44:43

回答

1

PHP脚本通常以非超级用户身份运行,因为它们通常由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 ]; 

确保该文件属于根(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");

+0

感谢您的建议。使用PHP脚本在控制台上执行怎么样?例如:'exec(“/path/delete-file.php $ filename”);' – 2013-03-13 20:05:22

+0

这应该是安全的,尽管我不认为你可以使用suid那么。速拨PHP非常好。 – 2013-03-15 09:22:30

1

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

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

更好的方法是将文件的所有者更改为PHP运行的用户,或者将其添加到PHP中,以便PHP可以删除它们(尽管这样做也不是很高雅,因为您可以让每个用户都可以访问文件机器)。

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

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

(替代apache:apache与你的PHP用户和/或组)

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