помогите написать скрипт

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
maniac
мл. сержант
Сообщения: 149
Зарегистрирован: 2006-05-31 7:42:14

помогите написать скрипт

Непрочитанное сообщение maniac » 2007-08-22 12:56:28

Народ плохо разбираюсь в программировании. Помогите с написание скрипта. FreeBSD 6.2 есть файлик типа text.txt и рисунок, мне нужно написать скрипт чтобы это каждый день через крон отправлялось на почту. Как это сделать???

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
manefesto
Группенфюррер
Сообщения: 6934
Зарегистрирован: 2007-07-20 8:27:30
Откуда: Пермь
Контактная информация:

Re: помогите написать скрипт

Непрочитанное сообщение manefesto » 2007-08-22 13:22:51

кхе... ты знаешь как работает sendmail ?
Если да то указываешь чтобы отправлял такому то адресату такое то вложение, и никакого скрипта писать не надо будет
я такой яростный шо аж пиздеЦ
Изображение

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35437
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: помогите написать скрипт

Непрочитанное сообщение Alex Keda » 2007-08-22 16:03:48

Код: Выделить всё

#!/bin/sh
cat file.txt > file.out
cat image.jpg | uuencode image.jpg >> file.out
mail -s mail_with_text_and_picture me@my-domain.su < file.out
непроверял.
Убей их всех! Бог потом рассортирует...

Аватара пользователя
serge
майор
Сообщения: 2133
Зарегистрирован: 2006-07-30 15:34:14
Откуда: Саратов
Контактная информация:

Re: помогите написать скрипт

Непрочитанное сообщение serge » 2007-08-25 19:00:56

Есть порт интересный:

Код: Выделить всё

[serge@server ~]$ cd /usr/ports/
[serge@server /usr/ports]$ make search name=biabam
Port:   biabam-0.9.7_1
Path:   /usr/ports/mail/biabam
Info:   A command-line attachment mailer
Maint:  ports@FreeBSD.org
B-deps:
R-deps: bash-3.2.17_2 gettext-0.16.1_3 libiconv-1.9.2_2
WWW:
как раз для этих целей

Аватара пользователя
BigBrother
сержант
Сообщения: 150
Зарегистрирован: 2007-07-27 17:05:55
Откуда: Украина
Контактная информация:

Re: помогите написать скрипт

Непрочитанное сообщение BigBrother » 2007-09-13 17:01:31

Помогите создать простенький скрипт. Задча такая, есть файл логов, нужно что бы при запуске скрипта он проверял есть ли в файле хоть один символ, а лучше если размер файл больше чем 0 (нуль) байт, тогда отправляем содержимое файла (или сам файл) по почте, после отпраки очищаем (но, не удаляем) файл. Этот скрип я потом запихну в крон.
поскольку я в программирование, кроме xHTML, не дружу, вот то, что я придумал.

Код: Выделить всё

#!/usr/local/bin/bash
mail -s logs admin@firma.com < /var/log/file.log
cat < /var/log/file.log
Команда кат со знаком < файл очишает, но потом приходится жать ctrl+c ибо она сама не замераешся, соответствено скрипт тоже не завершается. Понимаю что это извращенство, но другого не придумал, помогите плз :)

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35437
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: помогите написать скрипт

Непрочитанное сообщение Alex Keda » 2007-09-13 23:22:51

Код: Выделить всё

echo -n >/var/log/file.log
Убей их всех! Бог потом рассортирует...

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Re: помогите написать скрипт

Непрочитанное сообщение dikens3 » 2007-09-14 14:12:45

Код: Выделить всё

#!/bin/sh

LANG=ru_RU.KOI8-R
MM_CHARSET=KOI8-R
export LANG MM_CHARSET

text=$(cat /var/log/file.log/mainlog.0.gz | gunzip)
# Отправляем данные, если они есть.
if [ -n "$text" ]
        then
        echo "$text" | /usr/local/bin/mutt -s "Файл с логами" admin@domain.ru
fi
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

kmb
лейтенант
Сообщения: 680
Зарегистрирован: 2007-02-20 8:30:03
Контактная информация:

Re: помогите написать скрипт

Непрочитанное сообщение kmb » 2007-10-18 14:27:43

Код: Выделить всё

#!/bin/sh

external_IP="`/sbin/ifconfig iwi0 | grep inet | awk '{print $2}'`"
tmp_file="/tmp/ipacctd.traffic.$$.tmp"
logfile=$1

if [ $# -eq 1 ]
then
    stime="`head -1 $logfile | awk '{print $8}'`"
    etime="`tail -1 $logfile | awk '{print $8}'`"
    stime="`date -r $stime`"
    etime="`date -r $etime`"
        cat $logfile | grep "^[0-9]" | grep -v "^$external_IP"| awk '
            BEGIN { ib=0 }
                    {
                       ib=$6+ib
                    }
            END {
                printf "%s \n",ib
            } ' > ${tmp_file}
            read bytes_in < ${tmp_file}
        cat $logfile | grep "^[0-9]" | grep "^$external_IP"| awk '
            BEGIN { ob=0 }
                    {
                       ob=$6+ob
                    }
            END {
                printf "%s \n",ob
            } ' > ${tmp_file}
            read bytes_out < ${tmp_file}
            rm ${tmp_file}
echo "$stime "-" $etime
IN:      `expr ${bytes_in} / 1048576` Mb
OUT:     `expr ${bytes_out} / 1048576` Mb"          
#echo ${bytes_in} ${bytes_out}
elif [ $# -eq 0 ]
then
    echo "Please, select path to logfile."
else
stime=`date -j -f "%d/%m/%Y %H:%M:%S" "$2 00:00:00" "+%s"`
etime=`date -j -f "%d/%m/%Y %H:%M:%S" "$3 23:59:59" "+%s"`
        cat $logfile | grep "^[0-9]" | grep -v "^$external_IP"| awk '
            BEGIN { ib=0 }
                    {
                       ib=$6+ib
                    }
            END {
                printf "%s \n",ib
            } ' > ${tmp_file}
            read bytes_in < ${tmp_file}
        cat $logfile | grep "^[0-9]" | grep "^$external_IP"| awk '
            BEGIN { ob=0 }
                    {
                       ob=$6+ob
                    }
            END {
                printf "%s \n",ob
            } ' > ${tmp_file}
            read bytes_out < ${tmp_file}
            rm ${tmp_file}
stime="`date -r $stime`"
etime="`date -r $etime`"
echo "$stime "-" $etime
IN:      `expr ${bytes_in} / 1048576` Mb
OUT:     `expr ${bytes_out} / 1048576` Mb"          
#echo ${bytes_in} ${bytes_out}
fi
exit 0
не получается дописать блок else, более конкретно нужно вставить условие:
if( $8 >= $stime && $8 <= $etime ), т.е. выбрать все значение подпадающие под выбранные даты.
Пробывал по-разному:
cat $logfile | grep "^[0-9]" | grep -v "^$external_IP"| awk '
if( $8 >= $stime && $8 <= $etime )
BEGIN { ib=0 }
{
ib=$6+ib
}
END {
printf "%s \n",ib
} ' > ${tmp_file}
read bytes_in < ${tmp_file}
cat $logfile | grep "^[0-9]" | grep "^$external_IP"| awk '
if( $8 >= $stime && $8 <= $etime )
BEGIN { ob=0 }
{
ob=$6+ob
}
END {
printf "%s \n",ob
} ' > ${tmp_file}
read bytes_out < ${tmp_file}
rm ${tmp_file}
Но увы, мои познания в sh-программировании очень слабы :/
Может кто-нибудь поможет?

p.s. кстати начальный скрипт Лиса для подсчета трафд =) пытаюсь переделать для подсчета ipacctd :)
truth is out there...

Аватара пользователя
schizoid
подполковник
Сообщения: 3228
Зарегистрирован: 2007-03-03 17:32:31
Откуда: Украина, Чернигов
Контактная информация:

Re: помогите написать скрипт

Непрочитанное сообщение schizoid » 2007-10-18 14:40:40

if ( [ -n "${if%:}" ] && [ -n "$vip" ] && [ -n "$rip" ] && [ -n "$host" ] )
then i=0 && echo "${if%:} ~ $vip ~ $rip ~ $host ~ $date" | mail -s "Bad connections!!!" admin@domen
fi
кадато так писал...работало
ядерный взрыв...смертельно красиво...жаль, что не вечно...

kmb
лейтенант
Сообщения: 680
Зарегистрирован: 2007-02-20 8:30:03
Контактная информация:

Re: помогите написать скрипт

Непрочитанное сообщение kmb » 2007-10-18 15:31:10

Код: Выделить всё

awk: syntax error at source line 2
 context is
         >>>    if <<<  ( [ $8>=1 ] && [ $8<=5 ] )
awk: bailing out at source line 10
expr: syntax error
квадратные скобки не помогли :/
truth is out there...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35437
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: помогите написать скрипт

Непрочитанное сообщение Alex Keda » 2007-10-18 15:39:18

http://www.lissyara.su/?id=1075
========
там используются всякие фени типа "-o" и прочия...
Убей их всех! Бог потом рассортирует...

Аватара пользователя
schizoid
подполковник
Сообщения: 3228
Зарегистрирован: 2007-03-03 17:32:31
Откуда: Украина, Чернигов
Контактная информация:

Re: помогите написать скрипт

Непрочитанное сообщение schizoid » 2007-10-18 16:05:11

а че это за конструкция то такая? >= <= ? :)

Код: Выделить всё

УСЛОВИЯ СРАВНЕНИЯ ЦЕЛЫХ ЧИСЕЛ: 
x -eq y 	"x" равно "y", 
x -ne y 	"x" неравно "y", 
x -gt y 	"x" больше "y", 
x -ge y 	"x" больше или равно "y", 
x -lt y 	"x" меньше "y", 
x -le y 	"x" меньше или равно "y".
ядерный взрыв...смертельно красиво...жаль, что не вечно...

Гость
проходил мимо

Re: помогите написать скрипт

Непрочитанное сообщение Гость » 2007-10-18 16:24:35

lissyara, точняк:
  • >= это [ $x -ge $y ]. ge - greater or equal (algebraically)
  • <= это [ $x -le $y ]. le - less or equal (algebraically)
  • >= это [ $x > $y -o $x = $y ]. ge - greater or equal (binary value of characters)
  • <= это [ $x < $y -o $x = $y ]. le - less or equal (binary value of characters)

Гость
проходил мимо

Re: помогите написать скрипт

Непрочитанное сообщение Гость » 2007-10-18 16:35:22

ах, че-то мя заглючило. В awk'е не работают квадратные скобки, кои являются алиасом test(1). Там скорее всего это делается путем объединения условий при помощи фигурных скобок {}.

stgib
рядовой
Сообщения: 15
Зарегистрирован: 2007-08-01 4:43:26

Re: помогите написать скрипт

Непрочитанное сообщение stgib » 2007-10-18 16:51:49

kmb, а если взять $stime и $etime в кавычки вида "'$var'"?

kmb
лейтенант
Сообщения: 680
Зарегистрирован: 2007-02-20 8:30:03
Контактная информация:

Re: помогите написать скрипт

Непрочитанное сообщение kmb » 2007-10-18 19:44:18

сделал так:

Код: Выделить всё

#!/bin/sh

external_IP="`/sbin/ifconfig iwi0 | grep inet | awk '{print $2}'`"
tmp_file="/tmp/ipacctd.traffic.$$.tmp"
logfile=$1

if [ $# -eq 1 ]
then
    stime="`head -1 $logfile | awk '{print $8}'`"
    etime="`tail -1 $logfile | awk '{print $8}'`"
    stime="`date -r $stime`"
    etime="`date -r $etime`"
        cat $logfile | grep "^[0-9]" | grep -v "^$external_IP"| awk '
            BEGIN { ib=0 }
                    {
                       ib=$6+ib
                    }
            END {
                printf "%s \n",ib
            } ' > ${tmp_file}
            read bytes_in < ${tmp_file}
        cat $logfile | grep "^[0-9]" | grep "^$external_IP"| awk '
            BEGIN { ob=0 }
                    {
                       ob=$6+ob
                    }
            END {
                printf "%s \n",ob
            } ' > ${tmp_file}
            read bytes_out < ${tmp_file}
            rm ${tmp_file}
echo "$stime "-" $etime
IN:      `expr ${bytes_in} / 1048576` Mb
OUT:     `expr ${bytes_out} / 1048576` Mb"          
#echo ${bytes_in} ${bytes_out}
elif [ $# -eq 0 ]
then
    echo "Please, select path to logfile."
else
stime=`date -j -f "%d/%m/%Y %H:%M:%S" "$2 00:00:00" "+%s"`
etime=`date -j -f "%d/%m/%Y %H:%M:%S" "$3 23:59:59" "+%s"`
#echo $stime $etime
        cat $logfile | grep "^[0-9]" | grep -v "^$external_IP" | awk '
            BEGIN { ib=0 }
                    {
                    if($8>='$stime' && $8<='$etime')
                        ib=$6+ib
                    }
            END {
                printf "%s \n",ib
            }
             ' > ${tmp_file}
            read bytes_in < ${tmp_file}    
        cat $logfile | grep "^[0-9]" | grep "^$external_IP"| awk '
            BEGIN { ob=0 }
                    {
                    if($8>='$stime' && $8<='$etime')
                       ob=$6+ob
        ob = $8
                    }
            END {
                printf "%s \n",ob
            } ' > ${tmp_file}
            read bytes_out < ${tmp_file}
            rm ${tmp_file}
stime="`date -r $stime`"
etime="`date -r $etime`"
echo "$stime "-" $etime
IN:      `expr ${bytes_in} / 1048576` Mb
OUT:     `expr ${bytes_out} / 1048576` Mb"          
#echo ${bytes_in} ${bytes_out}
fi
exit 0
запускаю:
./t.sh t.log
ответ:
Wed Oct 17 12:19:09 UTC 2007 - Thu Oct 18 11:15:19 UTC 2007
IN: 24 Mb
OUT: 5 Mb
запускаю так:
./t.sh t.log 10/10/2007 18/10/2007
по идее ответ такой же должен быть, однако получаю:
Wed Oct 10 00:00:00 UTC 2007 - Thu Oct 18 23:59:59 UTC 2007
IN: 24 Mb
OUT: 1137 Mb
что не так... не врубаюсь...
truth is out there...

kmb
лейтенант
Сообщения: 680
Зарегистрирован: 2007-02-20 8:30:03
Контактная информация:

Re: помогите написать скрипт

Непрочитанное сообщение kmb » 2007-10-18 20:20:05

похоже ipacctd в последний столбец добавляет не по порядку... эх... видимо придеться вначале сортировать файл по последнему столбцу... :(
truth is out there...

kmb
лейтенант
Сообщения: 680
Зарегистрирован: 2007-02-20 8:30:03
Контактная информация:

Re: помогите написать скрипт

Непрочитанное сообщение kmb » 2007-10-18 21:08:26

Код: Выделить всё

192.168.1.1     520     192.168.1.3     520     udp     1114    2       1
192.168.1.3     190     255.255.255.250 1900    udp     2500    77      4
192.168.1.1     10      192.168.1.3     0       icmp    1101    37      5
192.168.1.1     10      192.168.1.3     0       icmp    1111    37      2
192.168.1.3     111     255.255.255.250 3128    tcp     1052    6       3
а как сортировку выполнить по-последнему столбцу? пробывал так:
cat unsorted_file | awk '{print $8}' | sort -n>>sorted_file
но в sorted_file только и отсортированная строка :/
truth is out there...

kmb
лейтенант
Сообщения: 680
Зарегистрирован: 2007-02-20 8:30:03
Контактная информация:

Re: помогите написать скрипт

Непрочитанное сообщение kmb » 2007-10-18 22:00:06

сделал через ж =)

Код: Выделить всё

less sort.sh 
#!/bin/sh
cat unsorted_file | awk '{print $8"     "$1"    "$2"    "$3"    "$4"    "$5"    "$6"    "$7"    "$8}' | sort -n>>sorted_file

Код: Выделить всё

less clear.sh 
#!/bin/sh
cat sorted_file |  awk '{print $2"    "$3"    "$4"    "$5"    "$6"    "$7"   "$8"    "$9}'>> clear_sorted_file
p.s. нашел очепятку, терь потестирую пару дней и выложу, мож кому пригодиться) всем спасибо.
truth is out there...

stgib
рядовой
Сообщения: 15
Зарегистрирован: 2007-08-01 4:43:26

Re: помогите написать скрипт

Непрочитанное сообщение stgib » 2007-10-18 22:28:45

kmb, а чем sort -gk8 не угодил?
sort(1) писал(а): -k, --key=POS1[,POS2]
start a key at POS1, end it at POS 2 (origin 1)
<snip>
POS is F[.C][OPTS], where F is the field number and C the character
position in the field. OPTS is one or more single-letter ordering
options, which override global ordering options for that key. If no
key is given, use the entire line as the key.

kmb
лейтенант
Сообщения: 680
Зарегистрирован: 2007-02-20 8:30:03
Контактная информация:

Re: помогите написать скрипт

Непрочитанное сообщение kmb » 2007-10-18 22:50:21

вот, что значит не внимательно посмотрел в ман =))) сенькаю! :D
truth is out there...