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

Исходное сообщение
"исполнение perl из-под bash"

Отправлено wellus , 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

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


Содержание

Сообщения в этом обсуждении
"исполнение perl из-под bash"
Отправлено цц , 12-Авг-15 10:23 
> #!/bash/sh

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



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

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


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

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

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

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


"исполнение perl из-под bash"
Отправлено pavlinux , 12-Авг-15 22:33 
> cat, написанный на awk-е ...

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



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



"исполнение perl из-под bash"
Отправлено wellus , 13-Авг-15 10:34 
вот как раз с awk - я просто разобрался благодаря вот этому ресурсу -> http://rus-linux.net/MyLDP/consol/awk.html



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

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



"исполнение perl из-под bash"
Отправлено wellus , 13-Авг-15 10:45 
может напишите безвозмездно за вознаграждение? )


"исполнение perl из-под bash"
Отправлено wellus , 13-Авг-15 10:33 
не совсем копипаст, но собирал из различных примеров, да )



"исполнение perl из-под bash"
Отправлено pavlinux , 12-Авг-15 22:31 
> что я делаю не так?

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



"исполнение perl из-под bash"
Отправлено wellus , 13-Авг-15 10:38 
Ладно, зайдем по-другому, за вознаграждение может кто напишет?


"исполнение perl из-под bash"
Отправлено pavlinux , 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



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

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


"исполнение perl из-под bash"
Отправлено pavlinux , 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 тоже на баше переписать.


"исполнение perl из-под bash"
Отправлено Pahanivo , 16-Авг-15 22:20 
> Не, я - ленивое говно, которое читает доки =)

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


"исполнение perl из-под bash"
Отправлено wellus , 17-Авг-15 08:59 
не сработал твой скрипт )))
кидай почту, договоримся



"исполнение perl из-под bash"
Отправлено pavlinux , 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, Горбунов Сергей, выход


"исполнение perl из-под bash"
Отправлено wellus , 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р - нормально будет?


"исполнение perl из-под bash"
Отправлено pavlinux , 18-Авг-15 20:42 
>  ... только "\x " предательский вылазит ...

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


"исполнение perl из-под bash"
Отправлено pavlinux , 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);
}



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



"исполнение perl из-под bash"
Отправлено pavlinux , 22-Авг-15 04:39 

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

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