2010-09-01 76 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