2012-03-21 10 views
0

Phpには、シェルコマンドをトリックして任意のコマンドを実行するために使用される文字列の任意の文字をエスケープするメソッドescapeshellcmd()があります。特殊文字をエスケープしてファイル名の名前を再帰的に変更するシェルスクリプト?

<?php 
exec(find /music -type f -iname '*mp3'", $arrSongPaths); 
echo $arrSongPaths[0] //prints It Won´t Be Long.mp3; 
echo escapeshellcmd($arrSongPaths[0]) //prints It Wont Be Long.mp3; 
?> 

特殊文字をエスケープしてファイル名(特に* mp3)の名前を再帰的に変更するシェルスクリプトを作成する方法はありますか?

私はPHPで

$escapedSongPath = escapeshellarg($arrSongPaths[0]);  
exec("mv $arrSongPaths[0] $escapedSongPath"); 

これを実行しようとしましたが、それは動作しませんでした。とにかく、潜在的に危険なファイル名のコマンドを実行しているので、最後のコード行は安全ではありません$arrSongPaths[0]

答えて

2

セキュリティに関するすべてのことを愛するために、なぜrenameコマンドを使用していないのですか?シェルエスケープの問題はありません。 exec("mv ...")を置き換える:

rename($arrSongPaths[0], $escapedSongPath) 

...とエラーをチェック。

exec(find...)の代わりに、glob php操作ページのrecursive_globヒントを使用してください。

+0

Peteshに感謝します。 'recursive_glob'が' exec(find ...) 'よりも優先される理由はありますか? – user784637

+1

もう1つは優先されているわけではありません。あなたがやっていることはすべてPHPを残すことなく実行できるので、PHPで実装してください。シェルを呼び出す唯一の理由は、PHPで行うことができないタスクのためだけでなければなりません。 exec()のようなものを使用して言語をクロスするときはいつでも、それが動作することを確認するためには多くの作業が必要であり、安全に動作する必要があります。例えば'と呼ばれるトラック。 rm -rf /;。元の実装のmp3'はあなたのハードドライブを消去しようとしましたが、名前は '\; rm -rf/\; .mp3'にリネームされています。 – Petesh

関連する問題