The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"исполнение perl из-под bash"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Perl)
Изначальное сообщение [ Отслеживать ]

"исполнение perl из-под bash"  +/
Сообщение от wellus (ok) on 12-Авг-15, 00:52 
пытаюсь настроить конвертацию текста сообщений, прилетающих на e-mail.
Коротко структура
getmail - забирает письмо и отправляет его в procmail.
в procmail текст сообщения отправляется в исполняемый bash-файл
:0b
| /path/to/bash-файл

в bash-файле текст письма записывается в файл и должна произвестись конвертация

#!/bash/sh

tmp=$(mktemp /tmp/tmp.XXXXXX)
cat >$tmp
OUTFILE=$(mktemp /tmp/tmp.decode.XXXXX)

awk '{print $0}' < $tmp | perl -e 'use MIME::Decoder; $decoder = new MIME::Decoder "quoted-printable"; $decoder->decode(\*STDIN, \*STDOUT);' | iconv -f CP1251 > $OUTFILE

но этого не происходит, причем если я в командной строке исполню awk... то все нормально.

Пример текста сообщения:
test:=D0=CA=D1=C8, 16:30:28, =C3=EE=
=F0=E1=F3=ED=EE=E2 =D1=E5=F0=E3=E5=E9, =E2=FB=F5=EE=E4

что я делаю не так?

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по ответам | RSS]

1. "исполнение perl из-под bash"  +/
Сообщение от цц on 12-Авг-15, 10:23 
> #!/bash/sh
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "исполнение perl из-под bash"  +/
Сообщение от wellus (ok) on 12-Авг-15, 10:27 
намекаешь на #!/usr/bin/perl ?
дело в том , что отдельно, сам по себе bash-файл работает... а в связке с procmail - нет


Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "исполнение perl из-под bash"  +1 +/
Сообщение от Филимон Жаркий on 12-Авг-15, 12:04 
> дело в том , что отдельно, сам по себе bash-файл работает... а
> в связке с procmail - нет

Идея указать полные пути ко всему, что используется в скрипте, просто вопиёт

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "исполнение perl из-под bash"  +/
Сообщение от Andrey Mitrofanov on 12-Авг-15, 15:19 
>> дело в том , что отдельно, сам по себе bash-файл работает... а
>> в связке с procmail - нет
> Идея указать полные пути ко всему, что используется в скрипте, просто вопиёт

Или нормальный PATH= в начале написать.

+
Намёк, видимо, на то, что с /bin/sh в шебанге запускается не [совсем] баш.

++
cat, написанный на awk-е и заявка "в командной строке исполню awk" поражают воображение.

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "исполнение perl из-под bash"  +/
Сообщение от pavlinux (ok) on 12-Авг-15, 22:31 
> что я делаю не так?

MIME Decoder ниасилил на баше.


Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

6. "исполнение perl из-под bash"  +/
Сообщение от pavlinux (ok) on 12-Авг-15, 22:33 
> cat, написанный на awk-е ...

Это ж олдскул, где-то скопипастил видимо.  


Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

7. "исполнение perl из-под bash"  +/
Сообщение от Pahanivo (ok) on 12-Авг-15, 23:40 
вы чо сразу во все его носом ткнули - тут же можно было две недели лулзы ловить с одного только
awk '{print $0}' < $tmp |
а через месяцок пришли бы к пониманию конвейера как такового :)


Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "исполнение perl из-под bash"  +/
Сообщение от wellus (ok) on 13-Авг-15, 10:33 
не совсем копипаст, но собирал из различных примеров, да )


Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

9. "исполнение perl из-под bash"  –1 +/
Сообщение от wellus (ok) on 13-Авг-15, 10:34 
вот как раз с awk - я просто разобрался благодаря вот этому ресурсу -> http://rus-linux.net/MyLDP/consol/awk.html


Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

10. "исполнение perl из-под bash"  +/
Сообщение от wellus (ok) on 13-Авг-15, 10:38 
Ладно, зайдем по-другому, за вознаграждение может кто напишет?

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

11. "исполнение perl из-под bash"  +1 +/
Сообщение от Pahanivo (ok) on 13-Авг-15, 10:39 
> вот как раз с awk - я просто разобрался благодаря вот этому
> ресурсу -> http://rus-linux.net/MyLDP/consol/awk.html

похвально то, что вы пытаетесь разбираться, но таки лучший ресурс
man awk, а по ссылке просто голимые примеры.


Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

12. "исполнение perl из-под bash"  +/
Сообщение от wellus (ok) on 13-Авг-15, 10:45 
может напишите безвозмездно за вознаграждение? )

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

13. "исполнение perl из-под bash"  +/
Сообщение от pavlinux (ok) on 15-Авг-15, 18:26 
> Ладно, зайдем по-другому, за вознаграждение может кто напишет?

О, а что ж раньше молчал. Сумма?  


#!/bin/bash

#    Usage:
#
#    Encode
#    $ ./base64.sh < file > binary-file.base64
#    Decode
#    $ ./base64.sh -d < file.base64 > file
#


base64_charset=( {A..Z} {a..z} {0..9} + / = )
text_width=64

function display_base64_char {
  printf "${base64_charset[$1]}"; (( width++ ))
  (( width % text_width == 0 )) && printf "\n"
}

function encode_base64 {
  declare -a -i c8 c6
  c8=( $(printf "ibase=16; ${1:0:2}\n${1:2:2}\n${1:4:2}\n" | bc) )
  (( c6[0] = c8[0] >> 2 ))
  (( c6[1] = ((c8[0] &  3) << 4) | (c8[1] >> 4) ))
  case ${#c8[*]} in
    3) (( c6[2] = ((c8[1] & 15) << 2) | (c8[2] >> 6) ))
       (( c6[3] = c8[2] & 63 )) ;;
    2) (( c6[2] = (c8[1] & 15) << 2 ))
       (( c6[3] = 64 )) ;;
    1) (( c6[2] = c6[3] = 64 )) ;;
  esac

  for char in ${c6[@]}; do
    display_base64_char ${char}
  done
}

function decode_base64 {
  declare -a -i c8 c6
  for current_char in ${1:0:1} ${1:1:1} ${1:2:1} ${1:3:1}; do
     [ "${current_char}" = "=" ] && break
     position=0
     while [ "${current_char}" != "${base64_charset[${position}]}" ]; do
        (( position++ ))
     done

     c6=( ${c6[*]} ${position} )
  done

  (( c8[0] = (c6[0] << 2) | (c6[1] >> 4) ))

  case ${#c6[*]} in
    3) (( c8[1] = ( (c6[1] & 15) << 4) | (c6[2] >> 2) ))
       (( c8[2] = (c6[2] & 3) << 6 )); unset c8[2] ;;
    4) (( c8[1] = ( (c6[1] & 15) << 4) | (c6[2] >> 2) ))
       (( c8[2] = ( (c6[2] &  3) << 6) |  c6[3] )) ;;
  esac

  for char in ${c8[*]}; do
     printf "\x$(printf "%x" ${char})"
  done
}

if [ "$1" = "-d" ]; then   # decode

  content=$(cat - | tr -d "\n" | sed -r "s/(.{4})/\1 /g")
  for chars in ${content}; do decode_base64 ${chars}; done

else
  content=$(cat - | xxd -ps -u | sed -r "s/(\w{6})/\1 /g" | tr -d "\n")
  for chars in ${content}; do encode_base64 ${chars}; done
  echo
fi


Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

14. "исполнение perl из-под bash"  +/
Сообщение от Аноним (??) on 15-Авг-15, 19:05 
>> Ладно, зайдем по-другому, за вознаграждение может кто напишет?
> О, а что ж раньше молчал. Сумма?

Pavlinux - ты таки извращенец! Хотя после шахмат на awk-е меня уже ничем не прошибёшь :)))

Ответить | Правка | ^ к родителю #13 | Наверх | Cообщить модератору

15. "исполнение perl из-под bash"  +/
Сообщение от pavlinux (ok) on 16-Авг-15, 01:48 
>>> Ладно, зайдем по-другому, за вознаграждение может кто напишет?
>> О, а что ж раньше молчал. Сумма?
> Pavlinux - ты таки извращенец! Хотя после шахмат на awk-е меня уже
> ничем не прошибёшь :)))

Не, я - ленивое говно, которое читает доки =)


Advanced Bash-Scripting Guide: Example A-54. Base64 encoding/decoding

http://www.tldp.org/LDP/abs/html/contributed-scripts.html

Но код ещё можно за оптимизить, куски с xxd и sed тоже на баше переписать.

Ответить | Правка | ^ к родителю #14 | Наверх | Cообщить модератору

16. "исполнение perl из-под bash"  –1 +/
Сообщение от Pahanivo (ok) on 16-Авг-15, 22:20 
> Не, я - ленивое говно, которое читает доки =)

противоречие, однако :)

Ответить | Правка | ^ к родителю #15 | Наверх | Cообщить модератору

17. "исполнение perl из-под bash"  +/
Сообщение от wellus (ok) on 17-Авг-15, 08:59 
не сработал твой скрипт )))
кидай почту, договоримся


Ответить | Правка | ^ к родителю #13 | Наверх | Cообщить модератору

18. "исполнение perl из-под bash"  +/
Сообщение от pavlinux (ok) on 17-Авг-15, 13:47 
> не сработал твой скрипт )))

Патамуша я дятел, вместо MIME quoted printable декодил из base64 %-)


$ echo -e $(echo 'test:=D0=CA=D1=C8, 16:30:28, =C3=EE=F0=E1=F3=ED=EE=E2 =D1=E5=F0=E3=E5=E9, =E2=FB=F5=EE=E4' | sed 's/=/\\x/g') | iconv -f cp1251;
test:РКСИ, 16:30:28, Горбунов Сергей, выход

Ответить | Правка | ^ к родителю #17 | Наверх | Cообщить модератору

19. "исполнение perl из-под bash"  +/
Сообщение от wellus (ok) on 17-Авг-15, 19:39 
и чем тАдА это отличается от моего варианта? )))

я на основе твоего варианта сделал так:

#/bin/sh

tmp=$(mktemp /tmp/tmp.XXXXXX)
cat >$tmp
OUTFILE=$(mktemp /tmp/tmp.decode.XXXXX)


echo -e $(cat $tmp | sed 's/=/\\x/g') | iconv -f CP1251 | awk 'BEGIN {FS = ":"; RS = ""} {printf "To: "$1; print ""; print ""; printf $2":"; printf $3":"; print $4}' > $OUTFILE

Получилось:

To: test

\xD0\xCA\xD1\xC8, 11:03:13, \xC3\xEE\x \xF0\xE1\xF3\xED\xEE\xE2 \xD1\xE5\xF0\xE3\xE5\xE9, \xE2\xFB\xF5\xEE\xE4


а в коммандной строке работает ... только "\x " предательский вылазит ...

To: test

РКСИ, 11:03:13, Го\x рбунов Сергей, выход

-------------------------------
1000р - нормально будет?

Ответить | Правка | ^ к родителю #18 | Наверх | Cообщить модератору

20. "исполнение perl из-под bash"  +/
Сообщение от pavlinux (ok) on 18-Авг-15, 20:42 
>  ... только "\x " предательский вылазит ...

пробелы надо игнорить

Ответить | Правка | ^ к родителю #19 | Наверх | Cообщить модератору

21. "исполнение perl из-под bash"  +/
Сообщение от pavlinux (ok) on 18-Авг-15, 21:41 
> -------------------------------
> 1000р - нормально будет?

По 4.29 руб за байт;


#!/usr/bin/perl

use strict;
use utf8;
use MIME::QuotedPrint qw(decode_qp);
use Encode qw(decode);
use open ':std',':encoding(UTF-8)';

my $in;
my $out;

foreach $in (<>) {
        $out = decode_qp($in);
        print decode("cp1251", $out);
}


Ответить | Правка | ^ к родителю #19 | Наверх | Cообщить модератору

22. "исполнение perl из-под bash"  +/
Сообщение от wellus (ok) on 19-Авг-15, 10:53 
вот теперь порядок, работает! )
Куда золото отправлять? могу тебе на телефон положить.


Ответить | Правка | ^ к родителю #21 | Наверх | Cообщить модератору

23. "исполнение perl из-под bash"  +/
Сообщение от pavlinux (ok) on 22-Авг-15, 04:39 

> Куда золото отправлять?

В Опеннет http://www.opennet.ru/contact.shtml, а то у него сервера грохаются. :)

Ответить | Правка | ^ к родителю #22 | Наверх | Cообщить модератору


Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




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

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