В общем случае вы захотите использовать escapeshellarg
. Слепое завершение всего в одинарные кавычки работает большую часть времени, но не удастся, если один из ваших аргументов содержит одну кавычку!
string escapeshellarg ( string $arg )
escapeshellarg()
добавляет одинарные кавычки вокруг строки и заключает в кавычки / экранирует любые существующие одинарные кавычки, позволяя передавать строку непосредственно в функцию оболочки и обрабатывать ее как один безопасный аргумент. Эта функция должна использоваться для экранирования отдельных аргументов функций оболочки, поступающих от пользовательского ввода. Функции оболочки включают exec()
, system()
и оператор backtick .
Использование простой Perl-программы, которая печатает аргументы командной строки
#! /usr/bin/perl
$" = "]["; # " fix StackOverflow highlighting
print "[@ARGV]\n";
а затем модифицированная версия программы PHP из вашего вопроса
<?php
$var1 = "I'm a";
$var2 = "good boy,";
$var3 = "I am.";
$file = "./prog.pl " . implode(" ",
array_map("escapeshellarg",
array($var1,$var2,$var3)));
echo "command=", $file, "\n";
ob_start();
passthru($file);
$perlreturn = ob_get_contents();
ob_end_clean();
echo "return=", $perlreturn;
?>
мы видим следующий вывод:
$ php prog.php
command=./prog.pl 'I'\''m a' 'good boy,' 'I am.'
return=[I'm a][good boy,][I am.]