Добрый день.Правильна ли такая конструкция?
-------
my $dataToSign = "Some text\nSome text\nSome text\n";
my $signedQuery = `echo -ne "$dataToSign\n" | openssl dgst ... -hex`;
-------Собственно проблема в том что что-то лишнее где-то присутствует - подпись не верная генерируется. Делаем так (для проверки):
-------
my $dataToSign = "Some text\nSome text\nSome text\n";
open (FH, ">./tmpfile");
print FH $dataToSign;
close (FH);
my $signedQuery = `openssl dgst ... -hex ./tmpfile`;
------
Так все верно генерируется. Чего я недопонимаю?Всего доброго.
Ах да, это все #!/usr/bin/perl разумеется.
>Правильна ли такая конструкция?Попробуй так:
my $dataToSign = "Some text\nSome text\nSome text\n";
my $signedQuery = `echo -ne "$dataToSign" | openssl dgst ... -hex`;>Так все верно генерируется. Чего я недопонимаю?
Не ставь \n где попало.
>>Правильна ли такая конструкция?
>
>Попробуй так:
>
>my $dataToSign = "Some text\nSome text\nSome text\n";
>my $signedQuery = `echo -ne "$dataToSign" | openssl dgst ... -hex`;
>
>>Так все верно генерируется. Чего я недопонимаю?
>
>Не ставь \n где попало.Однохренственно. Да \n там действительно не нужен, когда в форум писал поставил случайно. Собственно его нет в реальном коде.
интересно то что если сделать так:
print `echo -ne "$dataToSign`;
, то получам на экране:
------
-ne Some text
Some text
Some text
------
не станно?
>Так все верно генерируется. Чего я недопонимаю?Не надо так делать.
Во-первых, плодятся лишние процессы (sh).
Во-вторых, sh не понимает -ne (man sh: Only one of the -e and -n options may be specified.).
В-третьих, нарветесь на проблемы с переводами строк/кавычками/обратными слешами в данных.Правильно:
open(PIPE, "| openssl ... |");
print PIPE $dataToSign;
print while(<PIPE>);
close PIPE;
>open(PIPE, "| openssl ... |");
>print PIPE $dataToSign;
>print while(<PIPE>);
>close PIPE;Хм. Странно но он результат в консоль валит при таком подходе
...
my $out;
...
$out = <PIPE>;
...
Опять не въезжаю - вроде маны уже перечитал все
>>open(PIPE, "| openssl ... |");
>>print PIPE $dataToSign;
>>print while(<PIPE>);
>>close PIPE;
>Хм. Странно но он результат в консоль валит при таком подходеТочно, так тоже нельзя :)
Правильный ответ - в perldoc perlipc, глава `Bidirectional Communication with Another Process'#!/usr/bin/perl
use FileHandle;
use IPC::Open2;$pid = open2(*OUT, *IN, "md5");
print IN "somedata";
close IN;
$result = <OUT>;
close OUT;waitpid($pid, 0); # чтобы зомбей не плодить
print "Result: $result\n";
>>>open(PIPE, "| openssl ... |");
>>>print PIPE $dataToSign;
>>>print while(<PIPE>);
>>>close PIPE;
>>Хм. Странно но он результат в консоль валит при таком подходе
>
>Точно, так тоже нельзя :)
>Правильный ответ - в perldoc perlipc, глава `Bidirectional Communication with Another Process'
>
>
>#!/usr/bin/perl
>
>use FileHandle;
>use IPC::Open2;
>
>$pid = open2(*OUT, *IN, "md5");
>
>print IN "somedata";
>close IN;
>$result = <OUT>;
>close OUT;
>
>waitpid($pid, 0); # чтобы зомбей не плодить
>
>print "Result: $result\n";
блин, интересно а на площадке (на хостинге) дадут процесс запустить отдельный. Думаю нет. Надо проверить. В любом случае спасибо.
>блин, интересно а на площадке (на хостинге) дадут процесс запустить отдельный. Думаю
>нет. Надо проверить. В любом случае спасибо.
А, по твоему, `` не запускают отдельный процесс?Кстати, имеет смысл посмотреть готовые модули.
http://search.cpan.org/~oesi/OpenSSL-0.09/OpenSSL/Digest.pm
>>блин, интересно а на площадке (на хостинге) дадут процесс запустить отдельный. Думаю
>>нет. Надо проверить. В любом случае спасибо.
>А, по твоему, `` не запускают отдельный процесс?
>
>Кстати, имеет смысл посмотреть готовые модули.
>http://search.cpan.org/~oesi/OpenSSL-0.09/OpenSSL/Digest.pmНе, уже смотрел, я немогу их собственно установить на площадке. Т.е. модули то ставятся а вот libopenssl'я нет и не будет, странно, но такая фот площадка.
К тому же я как-то не въехал как ему подсовывать ключ. Документацию посмотрел так краем глаза - там почти ничего нет в man'е, просто времени не было.
>
>К тому же я как-то не въехал как ему подсовывать ключ. Документацию
>посмотрел так краем глаза - там почти ничего нет в man'е,
>просто времени не было.
да. static
>Не, уже смотрел, я немогу их собственно установить на площадке. Т.е. модули
>то ставятся а вот libopenssl'я нет и не будет, странно, но
>такая фот площадка.
Хмм. Там openssl что-ли статически собран? У меня на FreeBSD /usr/bin/openssl слинкован с /usr/lib/libssl.so.4 и /lib/libcrypto.so.4. Ну, описанный способ с open2 вполне работоспособен, в случае чего.
>>Не, уже смотрел, я немогу их собственно установить на площадке. Т.е. модули
>>то ставятся а вот libopenssl'я нет и не будет, странно, но
>>такая фот площадка.
>Хмм. Там openssl что-ли статически собран? У меня на FreeBSD /usr/bin/openssl слинкован
>с /usr/lib/libssl.so.4 и /lib/libcrypto.so.4. Ну, описанный способ с open2 вполне работоспособен,
>в случае чего.
да, static.
Хотя попробую может в $HOME собрать. Может удастся. А как его юзать, походу вопрос сразу. Как подгрузить ключ?
>да, static.
>Хотя попробую может в $HOME собрать. Может удастся. А как его юзать,
>походу вопрос сразу. Как подгрузить ключ?
Ты про модуль? Не знаю, не пользовал. Если про open2, там можно ключи указывать и даже несколько команд, а-ля open2(*A, *B, "openssl -key1 | cat -n | wc -l | md5")
>>да, static.
>>Хотя попробую может в $HOME собрать. Может удастся. А как его юзать,
>>походу вопрос сразу. Как подгрузить ключ?
>Ты про модуль? Не знаю, не пользовал. Если про open2, там можно
>ключи указывать и даже несколько команд, а-ля open2(*A, *B, "openssl -key1
>| cat -n | wc -l | md5")Спасибо, Уважаемый, за помощь &mdash все отлично работает. :)