помогите перенести команды unix в скрипт на perl - PullRequest
2 голосов
/ 27 августа 2011

Я получаю некоторые ошибки компиляции perl, пытаясь преобразовать эти команды unix в perl.Использование одинарных и двойных кавычек отбрасывает меня (см. Ниже: my $curlcmd).

Вот рабочие команды unix, выполняемые по порядку:

export CERT=`/dev/bin/util --show dev.testaccnt | awk '{print $2}'`

/usr/bin/curl -c /home/foobar/cookee.txt --certify /dev/key.crt \
     --header "FooBar-Util:'${CERT}'" \
     https://devhost.foobar.com:4443/fs/workflow/data/source/productname?val=Summ

Я хочу сделать то же самое в Perl :

#Build cmd in perl
my $cookie='/home/foobar/cookee.txt';
my $certkey='/dev/key.crt';
my $fsProxyHostPort='devhost.foobar.com:4443';
my $fsPath='workflow/data/source/productname';
my $fsProxyOperation='Summ';
my $fsProxyURL="https://$fsProxyHostPort/fs/$fsPath?val=$fsProxyOperation";

#Get cert
my $cert=qx(/dev/bin/pass-util --show foobar.dev.testaccnt | awk '{print \$2}');

Вот где у меня возникают проблемы при его выполнении:

my $curlcmd = qx(/usr/bin/curl -c $cookie --certify $certkey --header "FooBar-Util:'${" . $cert . "}'". $fsProxyURL);

Может кто-нибудь показать мне, как настроитьэти команды в Perl правильно?

Ответы [ 3 ]

1 голос
/ 27 августа 2011

Это специально, что у вас есть два разных определения $cert?

Ваш перевод --header "FooBar-Util:'${CERT}'" плох. ${...} говорит оболочке вставить переменную CERT, но поскольку вы уже выполняете эту диссертацию из Perl, она не нужна и просто запутает.

Вам также не хватает пробела перед $fsProxyURL.

Поскольку вы, очевидно, не используете захваченный вывод curl для anyting, я бы предложил вместо этого использовать функцию system, чтобы избежать использования промежуточного синтаксического анализа командной строки:

system "/usr/bin/curl","-c",$cookie,"--certify",$certTheFirst,
       "--header","FooBar-Util:'$certTheSecond'", $fsProxyURL;

Наконец, не очень удобно использовать вспомогательный awk для разделения значения pass-util на поля, когда Perl делает такие вещи на отлично. Как только вы решите немедленную ошибку, я предлагаю

my @passwordline = split / /, qx(/dev/bin/util --show dev.testaccnt);
my $certTheSecond = $passwordline[1];
1 голос
/ 27 августа 2011

В сценарии оболочки у вас есть (частично):

--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.

0 голосов
/ 27 августа 2011

Это " . $cert . " кажется остатком какого-то другого кода, где использовались черные кавычки, а не qx Удаление черных кавычек и конкатенаций (.) работает на моем компьютере.

Итак, чтобы выполнить команду, выполните:

my $curlcmd = qx(/usr/bin/curl -c $cookie --certify $certkey --header "FooBar-Util:'${ $cert }'". $fsProxyURL);

После вашего комментария, если вы просто хотите напечатать команду, вы можете сделать:

my $curlcmd = qq(/usr/bin/curl -c $cookie --certify $certkey --header "FooBar-Util:'${ $cert  }'". $fsProxyURL);
print $curlcmd;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...