URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5776
[ Назад ]

Исходное сообщение
"perl, backticks, exec etc"

Отправлено alexey9 , 04-Окт-06 16:27 
Добрый день.

Правильна ли такая конструкция?

-------
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`;
------
Так все верно генерируется. Чего я недопонимаю?

Всего доброго.


Содержание

Сообщения в этом обсуждении
"perl, backticks, exec etc"
Отправлено alexey9 , 04-Окт-06 16:28 
Ах да, это все #!/usr/bin/perl разумеется.

"perl, backticks, exec etc"
Отправлено ACCA , 04-Окт-06 20:17 
>Правильна ли такая конструкция?

Попробуй так:

my $dataToSign = "Some text\nSome text\nSome text\n";
my $signedQuery = `echo -ne "$dataToSign" | openssl dgst ... -hex`;

>Так все верно генерируется. Чего я недопонимаю?

Не ставь \n где попало.


"perl, backticks, exec etc"
Отправлено alexey9 , 04-Окт-06 20:25 
>>Правильна ли такая конструкция?
>
>Попробуй так:
>
>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
------
не станно?


"perl, backticks, exec etc"
Отправлено AMDmi3 , 04-Окт-06 22:51 
>Так все верно генерируется. Чего я недопонимаю?

Не надо так делать.
Во-первых, плодятся лишние процессы (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;


"perl, backticks, exec etc"
Отправлено alexey9 , 04-Окт-06 23:07 
>open(PIPE, "| openssl ... |");
>print PIPE $dataToSign;
>print while(<PIPE>);
>close PIPE;

Хм. Странно но он результат в консоль валит при таком подходе
...
my $out;
...
$out = <PIPE>;
...
Опять не въезжаю - вроде маны уже перечитал все


"perl, backticks, exec etc"
Отправлено AMDmi3 , 04-Окт-06 23:34 
>>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";


"perl, backticks, exec etc"
Отправлено alexey9 , 04-Окт-06 23:41 
>>>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";
блин, интересно а на площадке (на хостинге) дадут процесс запустить отдельный. Думаю нет. Надо проверить. В любом случае спасибо.


"perl, backticks, exec etc"
Отправлено AMDmi3 , 04-Окт-06 23:45 
>блин, интересно а на площадке (на хостинге) дадут процесс запустить отдельный. Думаю
>нет. Надо проверить. В любом случае спасибо.
А, по твоему, `` не запускают отдельный процесс?

Кстати, имеет смысл посмотреть готовые модули.
http://search.cpan.org/~oesi/OpenSSL-0.09/OpenSSL/Digest.pm


"perl, backticks, exec etc"
Отправлено alexey9 , 04-Окт-06 23:47 
>>блин, интересно а на площадке (на хостинге) дадут процесс запустить отдельный. Думаю
>>нет. Надо проверить. В любом случае спасибо.
>А, по твоему, `` не запускают отдельный процесс?
>
>Кстати, имеет смысл посмотреть готовые модули.
>http://search.cpan.org/~oesi/OpenSSL-0.09/OpenSSL/Digest.pm

Не, уже смотрел, я немогу их собственно установить на площадке. Т.е. модули то ставятся а вот libopenssl'я нет и не будет, странно, но такая фот площадка.


"perl, backticks, exec etc"
Отправлено alexey9 , 04-Окт-06 23:49 

К тому же я как-то не въехал как ему подсовывать ключ. Документацию посмотрел так краем глаза - там почти ничего нет в man'е, просто времени не было.

"perl, backticks, exec etc"
Отправлено alexey9 , 04-Окт-06 23:57 
>
>К тому же я как-то не въехал как ему подсовывать ключ. Документацию
>посмотрел так краем глаза - там почти ничего нет в man'е,
>просто времени не было.


да. static


"perl, backticks, exec etc"
Отправлено AMDmi3 , 04-Окт-06 23:51 
>Не, уже смотрел, я немогу их собственно установить на площадке. Т.е. модули
>то ставятся а вот libopenssl'я нет и не будет, странно, но
>такая фот площадка.
Хмм. Там openssl что-ли статически собран? У меня на FreeBSD /usr/bin/openssl слинкован с /usr/lib/libssl.so.4 и /lib/libcrypto.so.4. Ну, описанный способ с open2 вполне работоспособен, в случае чего.

"perl, backticks, exec etc"
Отправлено alexey9 , 04-Окт-06 23:58 
>>Не, уже смотрел, я немогу их собственно установить на площадке. Т.е. модули
>>то ставятся а вот libopenssl'я нет и не будет, странно, но
>>такая фот площадка.
>Хмм. Там openssl что-ли статически собран? У меня на FreeBSD /usr/bin/openssl слинкован
>с /usr/lib/libssl.so.4 и /lib/libcrypto.so.4. Ну, описанный способ с open2 вполне работоспособен,
>в случае чего.


да, static.
Хотя попробую может в $HOME собрать. Может удастся. А как его юзать, походу вопрос сразу. Как подгрузить ключ?


"perl, backticks, exec etc"
Отправлено AMDmi3 , 05-Окт-06 01:59 
>да, static.
>Хотя попробую может в $HOME собрать. Может удастся. А как его юзать,
>походу вопрос сразу. Как подгрузить ключ?
Ты про модуль? Не знаю, не пользовал. Если про open2, там можно ключи указывать и даже несколько команд, а-ля open2(*A, *B, "openssl -key1 | cat -n | wc -l | md5")

"perl, backticks, exec etc"
Отправлено alexey9 , 06-Окт-06 05:31 
>>да, static.
>>Хотя попробую может в $HOME собрать. Может удастся. А как его юзать,
>>походу вопрос сразу. Как подгрузить ключ?
>Ты про модуль? Не знаю, не пользовал. Если про open2, там можно
>ключи указывать и даже несколько команд, а-ля open2(*A, *B, "openssl -key1
>| cat -n | wc -l | md5")

Спасибо, Уважаемый, за помощь &mdash все отлично работает. :)