В сценарии оболочки у вас есть (частично):
--header "FooBar-Util:'${CERT}'"
Это генерирует что-то вроде:
--header FooBar-Util:'data-from-certificate'
, где команда curl
получает возможность увидеть эти одинарные кавычки,Чтобы получить тот же результат в Perl, вам потребуется:
my $header = "FooBar-Util:'$cert'";
my $out = qx(/usr/bin/curl -c $cookie --certify $certkey --header $header $fsProxyURL);
Изменения:
- Потеряна запись
${ ... }
. - Потеряна операция конкатенации.
В ситуациях, когда у вас возникают проблемы с просмотром списка аргументов, отправленных команде, я рекомендую использовать программу, аналогичную команде shell echo
, но в которой каждый аргумент выводится в отдельной строке, а некак разделенный пробелами набор аргументов в одной строке.Я называю свою версию этого al
«списком аргументов».Если вы протестируете свои команды (например, версию оболочки), указав префикс всей командной строки al
, вы увидите аргументы, которые увидит curl
.Затем вы можете сделать то же самое в Perl, чтобы сравнить аргументы, которые curl
видит в оболочке, с аргументами, данными ей в Perl.Тогда вы сможете исправить проблемы, как правило, гораздо проще.
Для отладки с помощью al
:
my @lines = qx(al /usr/bin/curl -c $cookie --certify $certkey --header $header $fsProxyURL);
foreach my $line (@lines) { print "$line"; }
Если вы хотите написать al
на Perl:
#!/usr/bin/env perl
foreach my $arg (@ARGV) { print "$arg\n"; }
Приключения при проверке ответа
К счастью, я обычно проверяю, что я пишу как ответы - и то, что написано выше, в основном верно, за исключением одной детали;Perl удается вызвать оболочку по команде, и при этом оболочка очищает одинарные кавычки:
my $cert = 'certificate-info';
my $fsProxyURL = 'https://www.example.com/fsProxy';
my $cookie = 'cookie';
my $certkey = 'cert-key';
my $header = "FooBar-Util:'$cert'";
#my @out = qx(al /usr/bin/curl -c $cookie --certify $certkey --header $header $fsProxyURL);
my @cmdargs = ( 'al', '/usr/bin/curl', '-c', $cookie, '--certify', $certkey, '--header', $header, $fsProxyURL);
print "System:\n";
system @cmdargs;
print "\nQX command:\n";
my @lines = qx(@cmdargs);
foreach my $line (@lines) { print "$line"; }
Это приводит к:
System:
/usr/bin/curl
-c
cookie
--certify
cert-key
--header
FooBar-Util:'certificate-info'
https://www.example.com/fsProxy
QX command:
/usr/bin/curl
-c
cookie
--certify
cert-key
--header
FooBar-Util:certificate-info
https://www.example.com/fsProxy
Обратите внимание на разницу в`Линии FooBar!
На этом этапе вы начинаете задумываться, какой наименее грязный способ обойти это.Если вы хотите использовать оператор qx//
, то вы, вероятно, делаете:
my $header = "FooBar-Util:\\'$cert\\'";
. Это приводит к вариантным выводам (system
затем qx//
):
FooBar-Util:\'certificate-info\'
FooBar-Util:'certificate-info'
Такзапись qx//
теперь дает одинарные кавычки для выполняемой команды, как в сценарии оболочки.Это отвечает цели, поэтому я собираюсь предположить, что это «хорошо» для вас;Я просто не уверен, что я действительно принял бы это в своем собственном коде, но у меня нет более чистого механизма под рукой.Я бы хотел использовать механизм «массив аргументов» system
plus, сохраняя при этом вывод, но я не проверял, есть ли разумный (имеется в виду относительно простой) способ сделать это.
Еще один мимолетный комментарий;если какой-либо из ваших аргументов содержал пробелы, вы должны быть крайне осторожны с тем, что проходит через оболочку.Тогда наличие команды al
действительно окупается.Вы не можете определить, какие пробелы в выводе echo
являются частями одного аргумента, а какие являются разделителями, предоставленными echo
.