【问题标题】:Shell script to recursively rename filenames with special characters escaped?使用转义特殊字符递归重命名文件名的Shell脚本?
【发布时间】:2012-03-21 20:07:17
【问题描述】:

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] 的命令。

【问题讨论】:

    标签: php linux bash


    【解决方案1】:

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

    rename($arrSongPaths[0], $escapedSongPath)
    

    ...并检查错误。

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

    【讨论】:

    • 谢谢Petesh,recursive_globexec(find...) 更受欢迎吗?
    • 并不是说一个比另一个更受欢迎,只是你所做的一切都可以在不离开 php 的情况下完成,所以保持在 php 中的实现。调用 shell 的唯一原因应该只是用于无法在 php 中完成的任务。每当您使用诸如 exec() 之类的东西来跨语言时,都需要做大量工作来确保它可以正常工作,并且可以安全地工作。例如在您的原始实现中名为; rm -rf /;.mp3 的轨道会尝试擦除您的硬盘驱动器,但会通过内置重命名重命名为\; rm -rf /\; .mp3
    猜你喜欢
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2017-09-15
    • 2018-03-18
    • 1970-01-01
    • 2011-12-25
    • 2012-05-28
    相关资源
    最近更新 更多