Shell脚本以递归方式重命名带有特殊字符的文件名转义?

时间:2012-03-21 20:07:18

标签: php linux bash

Php有一个方法escapeshellcmd(),可以转义字符串中可能用于欺骗shell命令执行任意命令的任何字符。

<?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;
?>

有没有办法编写一个shell脚本,它会以特殊字符转义的方式递归重命名文件名(特别是* mp3)?

我试图在php

中这样做
$escapedSongPath = escapeshellarg($arrSongPaths[0]);    
exec("mv $arrSongPaths[0] $escapedSongPath");

但这不起作用。无论如何,最后一行代码是不安全的,因为您正在执行具有潜在危险文件名$arrSongPaths[0]的命令。

1 个答案:

答案 0 :(得分:2)

为了爱所有与安全相关的事情为什么你不使用php rename命令 - 它不会遇到任何shell转义问题。将exec("mv ...")替换为:

rename($arrSongPaths[0], $escapedSongPath)

...并检查错误。

而不是使用exec(find...)使用glob php操作页面中的recursive_glob提示。