The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
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, 16:28 , 04-Окт-06 (1)
    Ах да, это все #!/usr/bin/perl разумеется.
  • perl, backticks, exec etc, !*! ACCA, 20:17 , 04-Окт-06 (2)
    >Правильна ли такая конструкция?

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

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

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

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

    • perl, backticks, exec etc, !*! alexey9, 20:25 , 04-Окт-06 (3)
      >>Правильна ли такая конструкция?
      >
      >Попробуй так:
      >
      >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, 22:51 , 04-Окт-06 (4)
    >Так все верно генерируется. Чего я недопонимаю?

    Не надо так делать.
    Во-первых, плодятся лишние процессы (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, 23:07 , 04-Окт-06 (5)
      >open(PIPE, "| openssl ... |");
      >print PIPE $dataToSign;
      >print while(<PIPE>);
      >close PIPE;

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

      • perl, backticks, exec etc, !*! AMDmi3, 23:34 , 04-Окт-06 (6)
        >>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, 23:41 , 04-Окт-06 (7)
          >>>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, 23:45 , 04-Окт-06 (8)
            >блин, интересно а на площадке (на хостинге) дадут процесс запустить отдельный. Думаю
            >нет. Надо проверить. В любом случае спасибо.
            А, по твоему, `` не запускают отдельный процесс?

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

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

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

              • perl, backticks, exec etc, !*! alexey9, 23:49 , 04-Окт-06 (10)

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


                  да. static

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


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

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

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




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру