perl - 如何安全地将带空格的文件名传递给 Perl 中的外部命令?

标签 perl escaping

我有一个处理一堆文件名的 Perl 脚本,并在反引号内使用这些文件名。但文件名包含空格、撇号和其他时髦字符。

我希望能够正确地逃避它们(即不使用我头顶上的随机正则表达式)。是否有一个 CPAN 模块可以正确转义字符串以在 bash 命令中使用?我知道我过去已经解决了这个问题,但这次我找不到任何东西。似乎关于它的信息很少。

最佳答案

如果您可以管理它(即,如果您直接调用某些命令,没有任何 shell 脚本或高级重定向恶作剧),最安全的做法是避免完全通过 shell 传递数据。

在 perl 5.8+ 中:

my @output_lines = do {
    open my $fh, "-|", $command, @args or die "Failed spawning $command: $!";
    <$fh>;
};

如果需要支持5.6:
my @output_lines = do {
    my $pid = open my $fh, "-|";
    die "Couldn't fork: $!" unless defined $pid;
    if (!$pid) {
        exec $command, @args or die "Eek, exec failed: $!";
    } else {
        <$fh>; # This is the value of the C<do>
    }
};

perldoc perlipc有关此类业务的更多信息,另请参阅 IPC::Open2IPC::Open3 .

关于perl - 如何安全地将带空格的文件名传递给 Perl 中的外部命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1267669/

相关文章:

perl - 如何在 Perl 中将像 3 10^-20 这样的字符串转换为数字?

mysql - Perl MySQL - 如何在不遍历整个表的情况下返回表的最后一行 ID?

regex - 如何使用 perl 在不应用两次的情况下提取文本,向前看和向后看字符串?

regex - 这个 Perl 正则表达式是什么意思 : m/(. *?) :(. *?)$/g?

c - 如何在原始输入模式下发送终端转义序列?

python - 如何在python中用单个反斜杠替换双反斜杠?

c++ - 如何在 C++ 字符串中存储 CTRL-A (0x01)?

Perl 关闭使用 open() 生成的子进程与 IPC::Open3 的行为差异

java - 内爆/爆炸字符串 : what escaping scheme would you suggest?

PHP 转义编码引号