Как я могу безопасно передать имя файла с пробелами к внешней команде в Perl?

Принятие Вашего webroot является проверенной копией дерева подверсии, Вы могли проанализировать/.svn/entries файл и сцепить число пересмотра (4-я строка здесь)...

В PHP:

$svn = File('.svn/entries');
$svnrev = $svn[3];
unset($svn);
7
задан brian d foy 13 August 2009 в 10:13
поделиться

2 ответа

Вы ищете quotemeta ?

Возвращает значение EXPR со всеми символами, не являющимися «словами», через обратную косую черту.

Обновление: Как Хоббс указывает в комментариях, quotemeta не предназначена для этой цели и после размышлений немного подробнее, могут возникнуть проблемы со встроенными nul s. С другой стороны, String :: ShellQuote хрипит при обнаружении встроенных null s.

Самый безопасный способ - полностью избегать оболочки. Использование формы списка 'system' может в значительной степени помочь в этом (несколько месяцев назад я с ужасом обнаружил, что cmd.exe все еще может быть задействован в Windows), Я бы рекомендовал это.

Если вам нужен вывод команды, лучше (с точки зрения безопасности) открывать трубу самостоятельно, как показано в ответе hobbs

3
ответ дан 6 December 2019 в 23:11
поделиться

Если вы можете управлять им (например, если вы вызываете какую-либо команду напрямую, без каких-либо сценариев оболочки или расширенных махинаций перенаправления), самый безопасный способ сделать это - полностью избежать передачи данных через оболочку .

В 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 :: Open2 и IPC :: Open3 .

6
ответ дан 6 December 2019 в 23:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: