Автор Тема: STDIN/STDOUT  (Прочитано 2914 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Skif

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 187
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
STDIN/STDOUT
« : 01 Июня 2005, 15:46:43 »
Объясните как правильно с ними работать?
Есть острая необходимость написать скрипт для фильтра в postfix, имеется пример в документации написанный на шел. вывод с smtpd демона в файл там передается так:

Цитировать

cat _> $DIR/$$ || { echo Cannot save mail to file; exit EX_TEMPFILE; }

сам фильтр привязывается таким способом(кусок master.cf)

Цитировать

smtp _ _inet _ _n _ _ _ - _ _ _ n _ _ _ - _ _ _ 10 _ _ _ smtpd
_ _ _ _ _ _ _ _ -o content_filter=mailfilter:dummy
mailfilter unix _- _ _ _ n _ _ _ n _ _ _ - _ _ _ 10 _ _ _ pipe
_ _flags=Rq user=pupkin argv=/usr/local/script/mail/mailfilter.sh -f ${sender}
-- ${recipient}


тоесть исходя из этого ясно, что smtpd просто передает на STDOUT содержимое сообщения в clear-text.
Вот это и нужно словить.
Самый простой способ, который напрашивается - system и кусок из shell скрипта. Но это, по моему не правильно и не красиво.
Может кто, пояснить как "правильно", схватить это сообщение?
пробовал и так:

open STDOUT
, \'>\', "/tmp/foo.out" or die "Can\'t redirect STDOUT: $!";
        print STDOUT $_;
close STDOUT;


и так


open STDOUT
, \'>\', "/tmp/foo.out" or die "Can\'t redirect STDOUT: $!";
        print STDOUT STDIN;
close STDOUT;

и еще парой методов - не получается. Пробовал уазывать в качестве пути к файлу STDOUT/STDIN - тоже ноль.
Подскажите, как словить вывод от программы?
Всё будет хорошо - я договорился!

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
STDIN/STDOUT
« Ответ #1 : 01 Июня 2005, 16:07:57 »
быстрое решение, - перенеси close STDOUT перед open STDOUT...

и на будущее
perldoc -f open, тут с примерами, пояснениями, хитростями и пр..
0 OK, 0:1

Оффлайн Skif

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 187
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
STDIN/STDOUT
« Ответ #2 : 01 Июня 2005, 16:24:35 »
ondr

в том же perldoc -f open

сказано следующее
               Though if you try to re-open "STDOUT" or "STDERR" as an "in
               memory" file, you have to close it first:

                   close STDOUT;
                   open STDOUT, \'>\', \\$variable or die "Can\'t open STDOUT: $!";

тоесть, если повторно, нужно открыть. А я первый раз хочу открыть.
Всё будет хорошо - я договорился!

Оффлайн Skif

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 187
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
STDIN/STDOUT
« Ответ #3 : 02 Июня 2005, 10:39:04 »
М-да...
Честно говоря, пришлось ради банальной вещи потратить почти 6 часов, пока не добрался домой и не полистал "Programming Perl"... Все что необходимо было, это напомнить, что дескриптор STDIN уже заранее определен в системе, и что бы получить данные нужно:

$mess=;

сделать или, что более правлиьно для получения многострочечного вывода,

@mess=;

И всего-то...
Всё будет хорошо - я договорился!

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28