perl - 我应该在 Perl 中转义 shell 参数吗?

标签 perl shell arguments

使用时system()在 Perl 中调用,您是否必须转义 shell 参数,还是自动完成?

参数将是用户输入,所以我想确保这是不可利用的。

最佳答案

如果您使用 system $cmd, @args而不是 system "$cmd @args" (数组而不是字符串),那么您不必转义参数,因为没有调用 shell 程序(请参阅 system )。 system {$cmd} $cmd, @args即使 $cmd 包含元字符并且 @args 为空(这被记录为 exec 的一部分)也不会调用 shell。如果 args 来自用户输入(或其他不受信任的来源),您仍然希望清除它们。见 -Tperlrun文档和 perlsec文档。

如果您需要读取输出或向命令发送输入,qxreadpipe没有等价物。相反,使用 open my $output, "-|", $cmd, @argsopen my $input, "|-", $cmd, @args虽然这不是可移植的,因为它需要一个真正的 fork这意味着只有 Unix ......我想。也许它的模拟叉可以在 Windows 上运行。更好的选择是类似 IPC::Run ,这也将处理管道命令到其他命令的情况,系统的多参数形式和 4 参数形式的 open 都无法处理。

关于perl - 我应该在 Perl 中转义 shell 参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/619926/

相关文章:

perl - 我如何告诉 Perl 的 IO::Socket::INET 使用哪个接口(interface)?

regex - 为什么我不能替换字符串中的所有内容,而是返回一个空字符串?

shell - sed 中的 "/i"标志是什么?

git - 如何使用SSH登录Github并在命令行中创建新的存储库?

c# - 创建通用T参数

perl - 如何在不重新启动 Perl 调试器中的脚本的情况下重新运行子例程?

perl - 如何在单个 Perl 正则表达式中同时执行负向前查找和负向后查找?

linux - 解析日志以查找每个用户的所有源 IP 的最快方法

python - 如何将随机函数作为参数传递?

javascript - ES6解构函数参数——命名根对象