2010-09-01 40 views
1

我想最终从PHP中的tar归档文件中提取一些文件,但是我的简单测试脚本在第一部分失败,那就是简单地列出归档文件中的文件。通过变量传递文件名到PHP内的tar?

这个测试脚本失败了吗?

我看到的输出是:

> -sh-3.2$ php showfile.php /var/www/vhosts/smartphonesoft.com/httpdocs/fred/epf/itunes20100825.tbz 
> tar: Old option `f' requires an 
> argument. Try `tar --help' or `tar 
> --usage' for more information. 

我简单的PHP脚本是:

<?php 
foreach (glob("/var/www/vhosts/smartphonesoft.com/httpdocs/fred/epf/itunes*.tbz") as $file) { 
} 
$path_parts = pathinfo($file); 
$tarfile = $path_parts['filename']; 
echo $file . "\n"; 
exec('tar tvf $file',$ret); 

?> 
+0

看看你要发送给tar文件;然后尝试在命令行上复制该内容。 – 2010-09-01 16:08:24

+0

我不太了解PHP,但是如果文件名中包含不常用的字符(如空格或连字符)(“ - ”),那么该脚本将执行什么操作? 什么是$ tarfile应该是什么?在分配它后,你不会在任何地方引用该变量 – telent 2010-09-01 16:13:33

回答

4

你有严重placen括号({}),以及EXEC内坏引号()功能:

<?php 
foreach (glob("/var/www/vhosts/smartphonesoft.com/httpdocs/fred/epf/itunes*.tbz") as $file) { 

$path_parts = pathinfo($file); 
$tarfile = $path_parts['filename']; 
echo $file . "\n"; 
exec("tar tvf $file",$ret); 

} 

>

编辑:根据Frxstrem的评论,永远不要忘记转义文件名(如果它包含例如空格,上面的例子代码将无法使用)。

exec("tar tvf ".escapeshellarg($file), $ret); 
+1

转义是非常重要的,因此您应该使用'“tar tvf”.escapeshellarg($ file)'而不是 – Frxstrem 2010-09-01 16:12:12

+0

@Frxstrem,谢谢,我更新了我的答案。 – nothrow 2010-09-01 16:15:40

+0

谢谢,那里只会有一个文件与那个特定的字符串匹配,因此是括号放置。 – kitenski 2010-09-01 16:49:50