здравствуйте, подскажите пожалуйста, где у меня ошибка. Задача - отправить несколько *.txt файлов из консоли, грубый пример кода:a=`ls -l *.txt | awk '{ print $9}' | while read line; do echo $line | sed -e "s%$line%uuencode $line $line;%g" | tr "\n" " "; done`
attach=\($a\)
$attach | mail -s "test" email@mail.ru
получаю сообщение об ошибке:
(uuencode: command not found
нужно как то экранировать скобку, но как, не пойму, если из консоли отправлять командой
(uuencode 1.txt 1.txt; uuencode 2.txt 2.txt; uuencode test.txt test.txt; ) | mail -s "test" email@mail.ru
то все отправляется нормально (
> здравствуйте, подскажите пожалуйста, где у меня ошибка. Задача - отправить несколько *.txt
> файлов из консоли, грубый пример кода:
> a=`ls -l *.txt | awk '{ print $9}' | while read line;
> do echo $line | sed -e "s%$line%uuencode $line $line;%g" | tr
> "\n" " "; done`
> attach=\($a\)
> $attach | mail -s "test" email@mail.ruможет?
for i in *.txt
do
uuencode "$i" "$i" | mail -s "subj" mail@mail.ru
done
>[оверквотинг удален]
>> a=`ls -l *.txt | awk '{ print $9}' | while read line;
>> do echo $line | sed -e "s%$line%uuencode $line $line;%g" | tr
>> "\n" " "; done`
>> attach=\($a\)
>> $attach | mail -s "test" email@mail.ru
> может?
> for i in *.txt
> do
> uuencode "$i" "$i" | mail -s "subj" mail@mail.ru
> doneможно и так, но к сожалению, таким образом отправляется несколько писем с одним вложением, а нужно вложить несколько файлов в одно письмо.
> (uuencode 1.txt 1.txt; uuencode 2.txt 2.txt; uuencode test.txt test.txt; ) | mailа прямо так написать религия не позволяет? не пойму зачем огород городить...
пишите в сабшеле = внутри скобок любую обработку и | mail.
[root@local ~]# cat ccc.bsh
#!/bin/bash
(
for i in 1 2 3
do
j="j-$i"
echo $j
done
)|tail -n 2[root@local ~]# ./ccc.bsh
j-2
j-3
>[оверквотинг удален]
> (
> for i in 1 2 3
> do
> j="j-$i"
> echo $j
> done
> )|tail -n 2
> [root@local ~]# ./ccc.bsh
> j-2
> j-3Спасибо за отклик, но таким образом отправится несколько писем с одним вложением. А нужно одно письмо с несколькими вложениями. Для ясности поясню ситуацию - есть 10 серверов, есть набор служб, которые в разных сочетаниях на них крутятся. Есть скрипт, который обрабатывает лог файлы за период, и складывает всю найденную инфу в txt файлики, после чего шлет на мыло. В итоге хочу получить следующее - по одному письму от каждого сервера с приложенными txt. Количество текстовых файликов может изменяться, поэтому и огород ) надеюсь что понятно описал проблему. Можно не запариваться и поставить mutt, но мне такой вариант не подходит, потому что есть машины, на которые mutt поставить не представляется возможным, а uuencode там есть.
>[оверквотинг удален]
>> for i in 1 2 3
>> do
>> j="j-$i"
>> echo $j
>> done
>> )|tail -n 2
>> [root@local ~]# ./ccc.bsh
>> j-2
>> j-3
> Спасибо за отклик, но таким образом отправится несколько писем с одним вложением.вложенные циклы обработки кто-то отменял?
[root@local ~]# cat ccc.bsh
#!/bin/bash
for n in 10 20 30
do
echo "$n:"
for i in 1 2 3
do
echo "mail $n-$i; "
done|tail -n 2
done[root@local ~]# ./ccc.bsh
10:
mail 10-2;
mail 10-3;
20:
mail 20-2;
mail 20-3;
30:
mail 30-2;
mail 30-3;
>[оверквотинг удален]
> [root@local ~]# ./ccc.bsh
> 10:
> mail 10-2;
> mail 10-3;
> 20:
> mail 20-2;
> mail 20-3;
> 30:
> mail 30-2;
> mail 30-3;извиняюсь за столь долгую задержку, по вашим примерам только что составил скрипт:
(
for n in *.txt
do
echo "uuencode $n $n;"
done
)| tr "\n" " " | mail -s "test" emailaddressполучил письмо со строкой
uuencode 1.txt 1.txt; uuencode 2.txt 2.txt; uuencode test.txt test.txt;такого результата я тоже достигал, главная проблема в том, что эту строку нужно выполнить, а не поместить в письмо (
>[оверквотинг удален]
> "\n" " "; done`
> attach=\($a\)
> $attach | mail -s "test" email@mail.ru
> получаю сообщение об ошибке:
> (uuencode: command not found
> нужно как то экранировать скобку, но как, не пойму, если из консоли
> отправлять командой
> (uuencode 1.txt 1.txt; uuencode 2.txt 2.txt; uuencode test.txt test.txt; ) | mail
> -s "test" email@mail.ru
> то все отправляется нормально (
в общем проблему решил так:#!/bin/bash
. configsendmail="/usr/sbin/sendmail"
boundary='simple boundary'(cat <<EOF;
To: $ADMINMAIL
From: $HOSTNAME
Subject: test
Content-Type: multipart/mixed; boundary=$boundaryThis is a multi-part message in MIME format.
--$boundary
EOF
for name in *.txt
do
file=`cat $name`
echo "Content-Type: application/octet-stream"
echo "Content-Transfer-Encoding: binary"
echo "Content-Disposition: attachment; filename="$name""
echo "$file"
echo ""
echo "--$boundary"
done
echo "--$boundary--"
echo ""
) | $sendmail -t -oiexit 0
осталась только одна проблема, файлы посылаются нормально, за исключением логов oracle :) надо их чем то кодировать, а я в этом пока не разобрался, если есть мысли по этому поводу - буду рад если подскажете
более конкретное описание проблемы - для кодирование в base64 нужно как то заменить переносы строк, таким образом, что бы base64 их понял... но я пока не знаю как
ну чтож) пообщаюсь сам с собой, на будущее всем кто столкнется с похожей проблемой.
почти "запилил" скрипт, теперь выглядит так:#!/bin/bash
. configsendmail="/usr/sbin/sendmail"
boundary='simple boundary'(cat <<EOF;
To: $ADMINMAIL
From: $HOSTNAME
Subject: test
Content-Type: multipart/mixed; boundary=$boundary
MIME-Version: 1.0--$boundary
EOF
for name in *.txt
do
sed -i 's/$'"/`echo \\\r`/g" $name #решает проблему с изменением переносов строк с LF на CRLF
echo "--$boundary"
echo "Content-Type: text/plain; name=\"$name\""
echo "Content-Transfer-Encoding: base64"
echo "Content-Disposition: attachment; filename=\"$name\""
echo ""
base64 $name
echo ""
done
echo "--$boundary--"
) | $sendmail -t -oiexit 0
для полного счастья осталось составить правильные заголовки для the bat (что бы аттачи были текстовыми файлами, а не часть.att), результат выложу, может кому интересно будет
....