在正确的方向上迈出了一步,添加"
,但您没有考虑到$data
可能包含"
、$
等。您可以使用String::ShellQuote来解决这个问题。
use String::ShellQuote qw( shell_quote );
my $cmd = shell_quote(
curl => (
'-sS',
'-X' => 'POST',
'-H' => 'Content-Type: application/gzip',
'--data-binary' => $data,
$url,
),
);
my $output = `$cmd`;
或者你可以完全避免使用shell。
my @cmd = (
curl => (
'-sS',
'-X' => 'POST',
'-H' => 'Content-Type: application/gzip',
'--data-binary' => $data,
$url,
),
);
open(my $pipe, '-|', @cmd) or die $!;
my $output = do { local $/; <$pipe> };
close($pipe);
如果您实际上不需要捕获输出,以下方法也完全避免了 shell:
system(
curl => (
'-sS',
'-X' => 'POST',
'-H' => 'Content-Type: application/gzip',
'--data-binary' => $data,
$url,
),
);
话虽如此,我不认为您能够发送包含NUL字节的字符串,而压缩文件很可能会有这种情况。我认为您的方法本质上是有缺陷的。
您知道吗,libcurl
(curl
的核心)可以通过Net::Curl::Easy访问吗?