Полезные скрипты наструганные на коленке.

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
valmont
проходил мимо

Непрочитанное сообщение valmont » 2007-05-02 9:45:36

скрипт для ЛИНУХА

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

for each in `ls -R |grep -v .mp3`;do rm -f $each;done;

Хостинговая компания 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/

Аватара пользователя
o2x
мл. сержант
Сообщения: 112
Зарегистрирован: 2007-01-31 17:46:54

Непрочитанное сообщение o2x » 2007-05-06 19:40:24

Переключение между каналами:

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

#! /bin/sh

route="/sbin/route"
ping="/sbin/ping"
natd="/sbin/natd"
sleep="/bin/sleep"
killall="/usr/bin/killall"
touch="/usr/bin/touch"

# внешние сетевые карты
lan_isp1="rl0"
lan_isp2="rl1"

GW1=194.242.118.61
GW2=83.218.237.45

$ping -q -c 2 $GW1 > /dev/null 2>&1

# Если код завершения пинга 1 = error
if [ $? !=0 ]; then
        # пингуем второй канал
        $ping -q -c 2 $GW2 > /dev/null 2>&1
        # если код завершение true =0
        if [ $? =0 ]; then
                # Если файла gw2.changed нет, создаем его.
                # Он определяет переход на основной канал,
                # даже если есть и резервный
                # GW2 будет маршрутом по умолчанию
                if [ ! -f /tmp/gw2.changed ]; then
                $route delete default
                $killall natd
                $route add default $GW2
                $touch /tmp/gw2.changed
                $sleep 15
                $natd -n ${lan_isp2}
                . /etc/fwrules2.sh
                exit 0;
                fi
        else
                echo "Оба канала не доступны";
                exit 1;
        fi
else
        # Если пинганулся первый шлюз
        # Если файл gw2.changed найден, удаляем его
        # GW1 будет маршрутом по умолчанию
        if [ -f /tmp/gw2.changed ]; then
                $route delete default
                $killall natd
                $route add default $GW1
                $rm /tmp/gw2.changed
                $sleep 15
                $natd -n ${lan_isp1}
                . /etc/fwrules1.sh
                exit 0;
        fi
        echo "Основной канал работает и установлен по умолчанию";
        exit 0;
fi

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

Непрочитанное сообщение dikens3 » 2007-05-07 10:40:26

Прикольно.
Зачем фаер перезапускать? (Понимаю, что если сделано, значит надо. Моё личное любопытство)

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

. /etc/fwrules2.sh

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

. /etc/fwrules1.sh
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
o2x
мл. сержант
Сообщения: 112
Зарегистрирован: 2007-01-31 17:46:54

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

На каждый канал, свой конфиг файера.
Мне так удобнее :)
Если второй канал не жирный, можно и пулы поставить, и прочее намудрить)

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

Непрочитанное сообщение dikens3 » 2007-05-07 11:30:45

o2x писал(а):На каждый канал, свой конфиг файера.
Мне так удобнее :)
Если второй канал не жирный, можно и пулы поставить, и прочее намудрить)
Мдя. Что-то мне это в голову не пришло.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

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

Непрочитанное сообщение Alex Keda » 2007-05-29 8:11:44

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

lissyara$ more /root/pkg_check_content.sh
#!/bin/sh

# pkg
pkg_db="/var/db/pkg"
pkg_preffix="/usr/local"

cd ${pkg_db}
ls | grep -v pkgdb.db |
{
while read pkg_name
do
        grep -v ^@ "${pkg_name}/+CONTENTS" |
        {
                while read file_name
                do
                # test - file exist?
                if test -r ${pkg_preffix}/${file_name}
                then
                        # exist
                else
                        # not exist
                        echo "corrupt pkg ${pkg_name} (file=${pkg_preffix}/${file_name})"
                fi
                done
        }

done
}


lissyara$  
скрипт для проверки - все ли файлы описанный в БД установленных пакетов реально присутствуют на диске. Немного туповато, и местами некорректно, но очень помогло после того как перемешались иксы 6,9 и 7,2 - и после сноса остатков 6.9 улетела часть 7.2
==========
может кто знает такое штатными средствами? Курение манов на pkg_* просветления не принесло..
Убей их всех! Бог потом рассортирует...

Аватара пользователя
o2x
мл. сержант
Сообщения: 112
Зарегистрирован: 2007-01-31 17:46:54

Непрочитанное сообщение o2x » 2007-05-29 13:42:47

Кусочек скрипта из файервола для создания правил на созданых интерфейсах
tun 0,1,2,... в зависимости от их колличества.

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

ifconfig="/sbin/ifconfig"
fwcmd="/sbin/ipfw"

# разделитель :
# масив устройств
device="`$ifconfig | grep "tun" | awk -F: '{print $1}'`"
# правила начиная со 100
n=100;
for i in $device
do
$fwcmd $n add allow ip from any to any via $i
n=`expr $n +1`;
done

Аватара пользователя
o2x
мл. сержант
Сообщения: 112
Зарегистрирован: 2007-01-31 17:46:54

Непрочитанное сообщение o2x » 2007-06-05 16:22:38

Скрипт, запускается в кронтабе каждые 10 минут. В текстовый файл ложится статистика времени отсутствия Интернета:

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

#! /bin/sh
ping="/sbin/ping"
# часы
date_time="`date +%H:%M:%S`"
# дата
date="`date +%d-%m-%Y`"
# часы минуты
date_hour="`date +%H`"
date_minute="`date +%M`"

# Пингуемые хосты
ISP="xxx.xxx.xxx.xxx"

# Создание файлов если их нет
if [ ! -f hour.txt ]; then
echo "$date_hour" > hour.txt
echo "$date_minute" > minute.txt
echo "" > interval.txt
fi

# Пингуем провайдера
$ping -q -c 4 ${ISP} >/dev/null 2>&1

# если результат равен 0 (true)
if [ $? -eq 0 ]; then
    echo "Провайдер Lecos - $ISP доступен."
    exit 0;
else
        echo "Ошибка связи. Провайдер Lecos - $ISP не доступен"2>/dev/null 1>&2
        # Последнее время проверки
        old_hour="`cat hour.txt`"
        old_minute="`cat minute.txt`"

        # Текущая разница времени
        end_hour="`expr $date_hour - $old_hour`"
        end_minute="`expr $date_minute - $old_minute`"


        echo "-------------------------------
        Дата:  $date
        Время: $date_time
        Время отсутствия: ${old_hour}:${old_minute} - ${date_hour}:${date_minute}
        Всего $end_hour часов $end_minute минут.
        -------------------------------" >> interval.txt
            # Интервалы отсутствия времени
            interval="`cat interval.txt`"
            echo "$date_hour" > hour.txt
            echo "$date_minute" > minute.txt
            echo
            echo "Интервалы времени отсутствия Интернета:   "
            echo "$interval"
exit 1;

fi


nomad
рядовой
Сообщения: 43
Зарегистрирован: 2006-04-06 16:52:27
Откуда: Russia, Chelyabinsk
Контактная информация:

Непрочитанное сообщение nomad » 2007-06-09 9:57:44

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

#!/bin/bash

# (c) nomad.
# Last modifyed @ 2007-02-05 @ 22:17
#
# Purpose:
#       script generates Cisco router commands.
#       Creates DHCP pool with IP addresses from 192.168.x.0/24 - one pool per VLAN
#       Excludes address 192.168.x.1 from DHCP assign
#       Creates subinterface on dot1Q trunk interface f0/1 to match selected VLAN and
#       assignes 192.168.x.1 address to this subinterface.
#
# Commands should be issued in configure terminal mode.

if [ $# -ne 2 ]
then
    echo "Missing arguments"
    echo "Usage: $0 startVlanID endVlanID"
    exit
fi

dns1="193.232.88.17"
dns2="194.84.23.125"

st=$1
end=$2

cnt=$st
while [ 1 ]
do
    echo "VLAN ID: $cnt"
    echo -n "Enter group description: "
    read desc
    echo "================================"

    # Subinterface creation code
    echo "int f0/1.${cnt}"
    echo "description ${desc}"
    echo "encapsulation dot1Q ${cnt}"
    echo "ip addr 192.168.${cnt}.1 255.255.255.0"
    echo "no snmp trap link-status"
    echo "no shut"
    echo "exit"
    echo ""

    # DHCP pool creation code
    echo "ip dhcp excluded-address 192.168.${cnt}.1"
    echo "ip dhcp pool ${desc}"
    echo "network 192.168.${cnt}.0 /24"
    echo "domain ${desc}"
    echo "dns ${dns1} ${dns2}"
    echo "default-router 192.168.${cnt}.1"
    echo "exit"
    echo ""

    # NAT pool creation - Inside Global Addresses Overloading
    echo "int f0/1.${cnt}"
    echo "ip nat inside"
    echo "ip access-group 13 out"
    echo "exit"
    echo ""

    echo "================================"
    cnt=`expr $cnt + 1`
    if [ $cnt -gt $end ]
    then
        break;
    fi
done


nomad
рядовой
Сообщения: 43
Зарегистрирован: 2006-04-06 16:52:27
Откуда: Russia, Chelyabinsk
Контактная информация:

Обработка TIFF файлов после потокового сканирования

Непрочитанное сообщение nomad » 2007-06-09 10:01:45

На работе стоит МФУ HP LJ 3390 с функцией потокового сканирования документов. Как-то раз надо было сканировать несколько переплетенных учебников с текстом на двух сторонах.

Главная фишка сканирования - нечетные идут в прямом порядке, а четные - в обратном, иначе надо перекладывать листы...

Снача сканируем блоки нечетных, потом четных, кладем в одно место и пускаем скрипт. Получаем один TIFF и PDF с упорядоченными страницами.

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

#!/bin/bash

dir=`pwd`
doutput="$dir/output"
dsort="$dir/sort"
dsource="$dir/source"

echo "Step 01: Creating necessary folders."
mkdir "$doutput" "$dsort" "$dsource"

#echo "Root dir: \"$dir\""
#echo "Output dir:  \"$doutput\""
#echo "Sort dir:  \"$dsort\""
#echo "Source dir:  \"$dsource\""

chapters=`ls even_*|wc -l`

################## creating subfolders structure #################
echo "Step 02: Creating subfolders structure."
y=0;
while [ $y -lt $chapters ]
do
    y=`expr $y + 1`
    dirname=`echo $y|sed 's/^[0-9]$/0\0/'`
    mkdir "$dsort/$dirname" "$dsort/$dirname/even" "$dsort/$dirname/odd" "$dsort/$dirname/result"
done

################# moving even pages blocks #######################
y=0;
for i in `ls even_*`
do
    y=`expr $y + 1`
    dirname=`echo $y|sed 's/^[0-9]$/0\0/'`
    cp "$i" "$dsort/$dirname/even/$i"
    mv "$i" "$dsource/$i"
done

################# moving odd pages blocks ########################
y=0;
for i in `ls odd_*`
do
    y=`expr $y + 1`
    dirname=`echo $y|sed 's/^[0-9]$/0\0/'`
    cp "$i" "$dsort/$dirname/odd/$i"
    mv "$i" "$dsource/$i"
done

################# splitting even tiff files  #####################
echo "Step 03: Splitting even tiff files."
even_pages=0;
cd "$dsort"
for i in *
do
    cd "$i/even"

    # Splitting block tiff to even pages (We should remember, that pages
    # are goin' in straight order
    for j in *.tif
    do
        target_name=`echo "$j"|sed 's/\.tif//'`
        tiffsplit "$j" "${target_name}_"
        echo -n "."
        rm -f "$j"
    done

    # Renaming even pages to match block global numeration
    cur=0;
    for j in *.tif
    do
        cur=`expr $cur + 1`
        name=`echo $cur|sed 's/^[0-9]$/00\0/'|sed 's/^[0-9][0-9]$/0\0/'`
        mv "$j" "${i}_${name}_even.tif"
        echo -n "."
    done

    even_pages=`expr $even_pages + $cur`

    cd "$dsort"
done

################# splitting odd tiff files  ######################
echo ""
echo "Step 04: Splitting and sorting odd tiff files."
odd_pages=0;
cd "$dsort"
for i in *
do
    cd "$i/odd"

    # Splitting block tiff to pages (We should remember, that pages
    # are goin' in reverse order
    cur=0;
    for j in *.tif
    do
        target_name=`echo "$j"|sed 's/\.tif//'`
        tiffsplit "$j" "${target_name}_"
        rm -f "$j"
        echo -n "."
    done

    cur=`ls *.tif|wc -l`
    odd_pages=`expr $odd_pages + $cur`

    # Reversing numeration of odd pages
    for j in *.tif
    do
        name=`echo $cur|sed 's/^[0-9]$/00\0/'|sed 's/^[0-9][0-9]$/0\0/'`
        mv "$j" "${i}_${name}_odd.tif"
        cur=`expr $cur - 1`
        echo -n "."
    done

    # From that point we should have odd pages with matching evens
    # numeration.
    cd "$dsort"
done

total_pages=`expr $even_pages + $odd_pages`

################# merging odd and even tiff files  ###############
echo ""
echo "Step 05: Merging odd and even pages."
cd "$dsort"
for block_name in *
do
    block_counter=0;
    cd "$block_name"
    even_pages=`ls even|wc -l`
    odd_pages=`ls odd|wc -l`
    if [ $even_pages -ne $odd_pages ]
    then
        echo "Block \"$block_name\": even_pages -  odd_pages counters mismatch: $even_pages - $odd_pages.";
        echo "Exiting..."
        cd "$dsource"
        mv *.tif ..
        cd "$dir"
        rm -fr "$dsort" "$dresult" "$dsource" "$doutput"
        exit;
    fi

    mv even/* "$doutput"
    mv odd/* "$doutput"

    cd "$dsort"
done

################# Generating output tiff and pdf output  #########
# From that point we should have all pages in right order in $output folder.
echo "Step 06: Generating tiff and pdf output."
cd "$doutput"
tiffcp *.tif "$dir/output.tif"
cd "$dir"
tiff2pdf -jbz output.tif -o output.pdf

################# Cleaning folders  ##############################
echo "Step 07: Cleaning folders."
cd "$dsource"
mv *.tif ..
cd "$dir"
rm -fr "$dsort" "$dresult" "$dsource" "$doutput"

################# Cleaning folders  ##############################
echo "Step 08: Sources."
echo
echo "Delete source files?"
echo
echo "        [Y]es"
echo "        [N]o (Default)"
echo
read answer
case "$answer" in
    "Y" | "y" )
            rm -f `ls|sed 's/output\.[a-z]*.//'`
        ;;
    "N" | "n" | "" )
        ;;
esac

################# Outro  #########################################
echo
echo
echo "#################################"
echo "#                               #"
echo "#           Done!!!             #"
echo "#                               #"
echo "#################################"
echo
echo


nomad
рядовой
Сообщения: 43
Зарегистрирован: 2006-04-06 16:52:27
Откуда: Russia, Chelyabinsk
Контактная информация:

sortByExifDate.sh

Непрочитанное сообщение nomad » 2007-06-09 10:03:29

Часто приносят фотографии с многодневных мероприятий или просто свалка из нескольких тысяч фото-шедевров. Чтобы как-то каталогизировать фото иногда сортирую их по дате.

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

#!/bin/bash

for i in `ls | grep -e ".*\.JPG$"`
do
    name=`echo "$i" | sed 's/JPG$/jpg/'`
    mv "$i" "$name"
done

for i in `ls | grep -i -e ".*\.JPEG$"`
do
    name=`echo "$i" | sed 's/JPEG$/jpg/'`
    mv "$i" "$name"
done

for i in *.jpg
do
    date=`exiv2 pr "$i" | grep "Image timestamp : " | sed 's/Image timestamp : //' | cut -d" " -f1 | sed 's/:/_/g'`
    echo "\"$i\" :=> $date"

    if [ -z "$date" ]
    then
        date=0000_00_00
    fi

    if [ ! -d "$date" ]
    then
        mkdir "$date"
    fi

    if [ -d $date ]
    then
        cp "$i" "$date"
    fi
done

nomad
рядовой
Сообщения: 43
Зарегистрирован: 2006-04-06 16:52:27
Откуда: Russia, Chelyabinsk
Контактная информация:

id3tag

Непрочитанное сообщение nomad » 2007-06-09 10:14:07

Shell-альтернатива TagRename.
Люблю наблюдать порядок в своем музыкальном архиве. Порядок простой: Корень\Артист\[ГодАльбома] Альбом\НомерТрекаСНулем - Название.mp3

Приходит все естесственно "как есть" без части информации о записях.

Переименовать кучу альбомов, указывая год и название.
album_rename.sh

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

#!/bin/bash

for i in *
do
    if [ -d "$i" ]
    then
    echo "Folder \"$i\""
    echo -n "Year: "
    read year
    echo -n "Title: "
    read album
    mv "$i" "[$year] $album"
    echo "\"$i\" => \"[$year] $album\""
    fi
done
Для полностью подготовленной структуры данных - прописать тэги. Т.е. в папке исполнителя лежат альбомы с соответствующим названием, а в них правильно названные и пронумерованные треки.
filename2tag_rename.sh

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

#!/bin/bash

artist=$1;
artist=`echo "$artist"|iconv -f koi8-r -t windows-1251`

for i in *;
    do
    if [ -d "$i" ]
    then
        year=`echo "$i"|sed 's/\[//'|sed 's/]//'|cut -d" " -f1`;
        album=`echo "$i"|sed 's/\[//'|sed 's/\]//'|sed 's/[0-9]*.//'`;
        album=`echo "$album"|iconv -f koi8-r -t windows-1251`
        y=0;
        cd "$i";

        for j in *.mp3;
        do
            title=`echo "$j"|sed 's/[0-9][0-9] - //'|sed 's/\.mp3//'`;
            title=`echo "$title"|iconv -f koi8-r -t windows-1251`
            y=`expr $y + 1`;
            pos=`echo $y|sed 's/^[0-9]$/0\0/'`;
            pos=`echo $y|sed 's/^[0-9]$/0\0/'`;
            id3tag --artist="$artist" --album="$album" --song="$title" --year="$year" --track="$pos" "$j";
        done;
    cd ..;
    fi
done;
Переименовать упорядоченные по номеру треки
songs_numbered_rename.sh

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

#!/bin/bash

y=0;
for i in *.mp3
do
    y=`expr $y + 1`
    num=`echo $y | sed 's/^[0-9]$/0\0/'`
    echo "$i"
    echo -n "Track title: "
    read title
    song=`echo "$title"|iconv -f koi8-r -t windows-1251`
    mv "$i" "$num - $title.mp3"
    echo "\"$i\" => \"$num - $title.mp3\""
    echo ""
done
Прописать id3tag->number для упорядоченных треков. Удобно, когда есть треки вида 01, 02, ..., но без названия или вообще чего-либо, кроме нормального id3tag'а, у которого не прописан номер трека.
songs_numbered_setTrackNum.sh

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

#!/bin/bash

y=0
for i in *.mp3
do
    y=`expr $y + 1`
    id3tag --track=$y "$i"
done
Пронумеровать треки.
songs_number.sh

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

#!/bin/bash

for song in *.mp3
do
    echo "\"$song\""
    echo -n "Track number: "
    read y
    num=`echo "$y" | sed 's/^[0-9]$/0\0/'`
    echo "\"$song\" => \"$num - $song\""
    id3tag --track="$y" "$song"
    mv "$song" "$num - $song"
    echo ""
done
Пронумеровать треки и проставить названия.
songs_rename.sh

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

#!/bin/bash

for i in *.mp3
do
    echo "$i"
    echo -n "Track #: "
    read num
    echo -n "Track title: "
    read title
    song=`echo "$title"|iconv -f koi8-r -t windows-1251`
    mv "$i" "$num - $title.mp3"
    echo "\"$i\" => \"$num - $title.mp3\""
    echo ""
done[
Создать правильную файловую структуру из готового id3-тега.
tag2filename.sh

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

#!/bin/bash

ext="mp3"
path=`pwd`

for dir in *
do
    if [ -d "$dir" ]
    then
    album="$dir"
    cd "$dir"

    for i in *.$ext
    do
        num=`id3info "$i"| grep "=== TRCK (Track number/Position in set):"|cut -d":" -f2|cut -d"/" -f1|sed 's/^\ //'|iconv -f windows-1251 -t koi8-r|sed 's/^[0-9]$/0\0/'`
        title=`id3info "$i"|grep "=== TIT2 (Title/songname/content description):"|cut -d":" -f2|sed 's/^\ //'|iconv -f windows-1251 -t koi8-r`
        album=`id3info "$i"|grep "=== TALB (Album/Movie/Show title):"|cut -d":" -f2|sed 's/^\ //'|iconv -f windows-1251 -t koi8-r`
        year=`id3info "$i"|grep "=== TYER (Year):"|cut -d":" -f2|sed 's/^\ //'`

        albumdir="$path/[$year] $album"
        mkdir -p "$albumdir"
        cp "$i" "$albumdir/$num - $title.$ext"
    done

    cd ..
    fi
done
Вложения
id3tag.zip
(3.2 КБ) 565 скачиваний

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

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

Давно обещщаный скрипт про лимиты squid+squidGuard+shell+php
вот посмотрите, и расскажете - пригодится ли кому. :))
=============
шелл-скрит, ночью по крону:

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

#!/bin/sh

# Год и месяц
year=`date '+%Y'`
month=`date '+%m'`

# Где логи сквида
squid_log="/var/old_log/${year}/${month}/squid.log"
#squid_log="squid.tmp.log"
# Временный файл
tmp_file="/tmp/squid.limits.$$.tmp"
# Файл исключений
exclude_file="/usr/local/etc/sarg/exclude.hosts"
# Файл с заоченными юзерами
lock_file="/usr/local/etc/squid/main_configs/overhead.users"
# Данные для mysql
mysql_preffix="/usr/local/bin/mysql --user=squid \
                        --password=squid --database=squid"


# Грохаем предыдущую таблицу с траффикм
${mysql_preffix} --execute="TRUNCATE \`user_traffic\`"
# Грохаем предыдущий список залоченных юзеров
echo "# Файл создан автоматически `date +%Y-%m-%d` в `date +%H:%M:%S`
" > ${lock_file}

# Достаём список пользователей
cat ${squid_log} | grep -v " d-zykov " | awk '{print $8}' | grep -v "^-" | sort \
| uniq -c | sort | awk '{print $2}' |
{
while read user_name
do
        # ПРоверяем, что пользователь не пустой
        if [ `echo "${user_name}" | wc -c` -ge 2 ]
        then

        # Выгребаем логи по этому пользователю, и считаем траффик
        cat ${squid_log} | grep -v " d-zykov " | grep " ${user_name} " |\
        grep --fixed-strings --invert-match --file=${exclude_file} \
        | awk '
                BEGIN { d=0 }
                {
                        # Суммируем 5-й столбец на вводе - траффик
                        d=$5+d
                }
                END {
                        printf " %s \n",d
                } ' > ${tmp_file}
        read user_bytes < ${tmp_file}
        rm -f ${tmp_file}
#       echo "USER = ${user_name};      traffic = ${user_bytes}"
        # Загоняем имя пользователя в БД - дефолтовый лимит 314572800 = 300 мег
        ${mysql_preffix} --execute="INSERT INTO \`user_limits\` VALUES \
                ('','${user_name}','314572800')" > /dev/null 2>&1
        # Загоняем данные о траффике в БД
        ${mysql_preffix} --execute="INSERT INTO \`user_traffic\` VALUES \
                ('','${user_name}','${user_bytes}')"

        # Достаём лимит этого пользователя
        user_limit=`${mysql_preffix} --skip-column-names  --execute="SELECT \
                user_limit FROM user_limits WHERE user_name='${user_name}'"`
#       echo "Пользователь = ${user_name};      Траффик = ${user_bytes};        Лимит = ${user_limit}"
        # Сравниваем лимит с текущим траффиком
        if [ ${user_bytes} -gt ${user_limit} ]
        then
        # Добавляем юзера в списки залоченных
        echo "Ограничен пользователь ${user_name}, траффик = ${user_bytes}, лимит = ${user_limit}"
        echo ${user_name} >> ${lock_file}
        fi
        fi
done
}

/usr/local/sbin/squid -k reconfigure
дамп таблиц:

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

-- 
-- База данных: `squid`
-- 

-- --------------------------------------------------------

-- 
-- Структура таблицы `user_limits`
-- 

CREATE TABLE `user_limits` (
  `id` int(5) NOT NULL auto_increment,
  `user_name` varchar(64) collate cp1251_bin NOT NULL,
  `user_limit` varchar(127) collate cp1251_bin NOT NULL default '0',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `user_name` (`user_name`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 COLLATE=cp1251_bin COMMENT='Таблица ограничений пользователей' AUTO_INCREMENT=0 ;

-- --------------------------------------------------------

-- 
-- Структура таблицы `user_traffic`
-- 

CREATE TABLE `user_traffic` (
  `id` int(5) NOT NULL auto_increment,
  `user_name` varchar(64) collate cp1251_bin NOT NULL,
  `user_traffic` bigint(128) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `user_name` (`user_name`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 COLLATE=cp1251_bin COMMENT='Траффик пользователей' AUTO_INCREMENT=0 ;
морда на php:

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

<?php
//echo "clientaddr = " . $HTTP_GET_VARS['clientaddr'] . "<br>";
//echo "clientname = " . $HTTP_GET_VARS['clientname'] . "<br>";
//echo "clientident = " . $HTTP_GET_VARS['clientident'] . "<br>";
//echo "srcclass = " . $HTTP_GET_VARS['srcclass'] . "<br>";
//echo "targetclass = " . $HTTP_GET_VARS['targetclass'] . "<br>";
//echo "url = " . $HTTP_GET_VARS['url'] . "<br>";

// коннектимсчя к БД
//Пароли для подключения к MySQL
$db_host = "localhost";
$db_user = "squid";
$db_passwd = "squid";
$db_db = "squid";
//Пытаемся приконнектится к БД
if(!mysql_connect($db_host,$db_user,$db_passwd)){
echo "<br><br><BIG><CENTER>Не могу прислюнявиться к MySQL-серванту!</CENTER></BIG>";
exit;
}
//Выбираем базу данных
mysql_select_db($db_db);

// Смотрим, не постил ли. Если брякнул кнопуку - надо пихать в БД новые данные.
if(isset($HTTP_POST_VARS['Submit'])){ // брякнута кнопка
// перебираем массив по значениям?
foreach(array_keys($HTTP_POST_VARS) as $key){ // открытие перебора массива $HTTP_POST_VARS
//echo " ключ =" . $key .  " значение = " . $HTTP_POST_VARS[$key] . "<br>\n";
// удаляем нах лишнюю хироманитию
$tmp_var_foreach = ereg_replace("[^a-zA-Z0-9_.-]", "", $key);
// достаём начало строки в $tmp_var_foreach и смотрим, совпадает ли оно с string_
// если да -> достаём строку, и её цвет, после чего пхаем в БД
//echo " Строка = " . $tmp_var_foreach . " Подстрока = " . substr("$tmp_var_foreach", 0, 8) . "<br>\n";
if(substr("$tmp_var_foreach", 0, 8) == 'traffic_'){ // толковый цикл - достаём значение
//echo "Толковый = " . $tmp_var_foreach . "<br>\n";
// достаём строку, что хранилась как кусок ключа
$string_signature = substr("$tmp_var_foreach", 8);
$color_key = "traffic_" . $string_signature;
//echo " стринг сигнатуре - " . $string_signature . " Значение = " . $HTTP_POST_VARS[$color_key] . "<br>\n";
//echo "Кверя = $sql <br>";
$sql = "UPDATE `user_limits` SET `user_limit`='" . ($HTTP_POST_VARS[$color_key]*1024*1024) . "' WHERE `user_name`='" . $string_signature . "'";
mysql_query($sql);

unset($string_signature);
} // закрытие -> толковый цикл

unset($tmp_var_foreach);
} // закрытие перебора массива $HTTP_POST_VARS


} // кнопка не брякнута





?>
<HTML>
<HEAD>
<TITLE>Управление траффиком пользователей</TITLE>
<META NAME="description" CONTENT="админка сайта www.lissyara.ru">
<META http-equiv="Content-Type" content="text/html;charset=koi8-r">
<!-- начало таблиц стилей для страницы -->
<STYLE type="text/css">
<!-- стиль для линков -->
A.text_link {COLOR: blue; TEXT-DECORATION: none}
A.text_link:link {COLOR: blue; TEXT-DECORATION: none}
A.text_link:visited {COLOR: blue; TEXT-DECORATION: none}
A.text_link:hover {COLOR: darkblue; TEXT-DECORATION: underline}
A.text_link:active {COLOR: darkblue; TEXT-DECORATION: none}
</STYLE>

</HEAD>
<BODY style="margin: 0 0 0 0; padding: 0 0 0 0; BACKGROUND-COLOR: #f1f1f1; BORDER-RIGHT: #999999 1px solid; MARGIN: 0px; BORDER-LEFT: #999999 1px solid; ">
<br><br><br>
<FORM ENCTYPE="multipart/form-data" method="POST">
<CENTER>
<TABLE width="600" border="0" cellpadding="0" cellspacing="0">
<TBODY>
        <TR>
                <TD width="100%" bgcolor="#707680">
                        <TABLE border="0" width="100%"  cellspacing="1" cellpadding="2">
                        <TBODY>
                                <TR bgcolor="#B9CCDF">
                                        <TD align="center" colspan="4">
                                                <CODE><b>Редактирование ограничений пользователей.</b></CODE>
                                        </TD>
                                </TR>
                                <TR bgcolor="#f1f1f1">
                                        <TD align="center" colspan="4">
                                                <CODE>&nbsp;</CODE>
                                        </TD>
                                </TR>
                                <TR bgcolor="#DAE0E7">
                                        <TD align="center">
                                                <CODE>Имя пользователя</CODE>
                                        </TD>
                                        <TD align="center">
                                                <CODE>Траффик (Мб)</CODE>
                                        </TD>
                                        <TD align="center">
                                                <CODE>Лимит (Mб)</CODE>
                                        </TD>
                                        <TD align="center">
                                                <CODE>Превышение (Мб)</CODE>
                                        </TD>
                                </TR>


<?php
// достаём список пользователей
// вытаскиваем статистику по пользователям из БД
$sql = mysql_query("SELECT `user_limits`.`user_name` , `user_limits`.`user_limit` , `user_traffic`.`user_traffic`
FROM `user_limits` , `user_traffic`
WHERE `user_traffic`.`user_name` = `user_limits`.`user_name`
ORDER BY `user_name` ");
// перебираем юзеров, строим таблицу.
while ($d = mysql_fetch_assoc($sql)) { // открытие цикла по перебору юзеров
        $bytes_in = $d['user_traffic'] /1048576;
        $bytes_in = round($bytes_in, 2);
        // цвет фона
        $bg_color="#f1f1f1";
        if($d['user_traffic'] > ($d['user_limit'] - 20971520)){$bg_color="#11AAFF";}
        if($d['user_traffic'] > $d['user_limit']){$bg_color="#FFAAFF";}
        // Если траффик меньше мега - не выводим
        if($d['user_traffic'] > 1024*1024){ // траффик больше - выводим
        // выводим чё настроили:
        echo "\t\t\t\t<TR bgcolor=\"" . $bg_color . "\">
        \t\t\t\t<TD align=\"center\">
        \t\t\t\t\t<CODE>" . $d['user_name'] . "</CODE>
        \t\t\t\t</TD>
        \t\t\t\t<TD align=\"center\">
        \t\t\t\t\t<CODE>" . $bytes_in . "</CODE>
        \t\t\t\t</TD>
        \t\t\t\t<TD align=\"center\">
        \t\t\t\t\t<CODE><INPUT type=\"text\" name=\"traffic_" . $d['user_name'] . "\" style=\"width: 100%; border: 1px solid #707680; color: #000000;\" valu
e=\"" . round($d['user_limit']/(1024*1024)) . "\"></CODE>
        \t\t\t\t</TD>
        \t\t\t\t<TD align=\"center\">
        \t\t\t\t\t<CODE>" . round(($d['user_traffic'] - $d['user_limit'])/(1024*1024)) . "</CODE>
        \t\t\t\t</TD>
        \t\t\t</TR>
        ";
 } // зкрытие - трафик боольше мега

} // зкрытие цикла по перебору юзеров


?>

                                <TR bgcolor="white">
                                        <TD align="center" colspan="4">
                                                <CODE>&nbsp;</CODE>
                                        </TD>
                                </TR>
                                <TR bgcolor="white">
                                        <TD align="center" colspan="4">
                                                <CODE><INPUT type="submit" value="Отправить" name="Submit" style="width: 445px; background-color:#DAE0E7; co
lor: #000000; font: 11px; font-size : 8pt; border: 1px solid #707680; cursor : hand;"></CODE>
                                        </TD>
                                </TR>







                        </TBODY>
                        </TABLE>
                </TD>
        </TR>
</TBODY>
</TABLE>
</FORM>
<br><br>
</BODY>
</HTML>


<?php

?>
Выдержки конфига сквидгарда, в части показа клиентам, чё стряслось:

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

......... skipped .............
src overhead{
        userlist        /usr/local/etc/squid/main_configs/overhead.users
}                                                                                                                                                           

......... skipped .............
acl {
        overhead {
                pass    local none
                redirect        http://192.168.0.253/squid_limit/index.php?clientaddr=%a&clientname=%n&clientident=%i&srcclass=%s&targetclass=%t&url=%u
        }
......... skipped .............
индексная страничка из конфига сквидгарда:

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

<?php
/*
echo "clientaddr = " . $HTTP_GET_VARS['clientaddr'] . "<br>";
echo "clientname = " . $HTTP_GET_VARS['clientname'] . "<br>";
echo "clientident = " . $HTTP_GET_VARS['clientident'] . "<br>";
echo "srcclass = " . $HTTP_GET_VARS['srcclass'] . "<br>";
echo "targetclass = " . $HTTP_GET_VARS['targetclass'] . "<br>";
echo "url = " . $HTTP_GET_VARS['url'] . "<br>";
*/
// коннектимсчя к БД
//Пароли для подключения к MySQL
$db_host = "localhost";
$db_user = "squid";
$db_passwd = "squid";
$db_db = "squid";
//Пытаемся приконнектится к БД
if(!mysql_connect($db_host,$db_user,$db_passwd)){
echo "<br><br><BIG><CENTER>Не могу прислюнявиться к MySQL-серванту!</CENTER></BIG>";
exit;
}
//Выбираем базу данных
mysql_select_db($db_db);



?>

<HTML>
<HEAD>
<TITLE>Доступ запрещён</TITLE>
<META NAME="description" CONTENT="админка сайта www.lissyara.ru">
<META http-equiv="Content-Type" content="text/html;charset=koi8-r">
<!-- начало таблиц стилей для страницы -->
<STYLE type="text/css">
<!-- стиль для линков -->
A.text_link {COLOR: blue; TEXT-DECORATION: none}
A.text_link:link {COLOR: blue; TEXT-DECORATION: none}
A.text_link:visited {COLOR: blue; TEXT-DECORATION: none}
A.text_link:hover {COLOR: darkblue; TEXT-DECORATION: underline}
A.text_link:active {COLOR: darkblue; TEXT-DECORATION: none}
</STYLE>

</HEAD>
<BODY style="margin: 0 0 0 0; padding: 0 0 0 0; BACKGROUND-COLOR: #f1f1f1; BORDER-RIGHT: #999999 1px solid; MARGIN: 0px; BORDER-LEFT: #999999 1px solid; ">
<br><br><br>
<FORM ENCTYPE="multipart/form-data" method="POST">
<CENTER>
<TABLE width="700" border="0" cellpadding="0" cellspacing="0">
<TBODY>
        <TR>
                <TD width="100%" bgcolor="#707680">
                        <TABLE border="0" width="100%"  cellspacing="1" cellpadding="2">
                        <TBODY>
                                <TR bgcolor="#B9CCDF">
                                        <TD align="center" colspan="2">
                                                <CODE><b>Доступ запрещён.</b></CODE>
                                        </TD>
                                </TR>
                                <TR bgcolor="#f1f1f1">
                                        <TD align="center" colspan="2">
                                                <CODE>&nbsp;</CODE>
                                        </TD>
                                </TR>
                                <TR bgcolor="#f1f1f1"">
                                        <TD align="left" width="200">
                                                <CODE>Имя пользователя</CODE>
                                        </TD>
                                        <TD align="left">
                                                <CODE><?php echo $HTTP_GET_VARS['clientident']; ?></CODE>
                                        </TD>
                                </TR>

                                <TR bgcolor="#f1f1f1"">
                                        <TD align="left">
                                                <CODE>IP-адрес</CODE>
                                        </TD>
                                        <TD align="left">
                                                <CODE><?php echo $HTTP_GET_VARS['clientaddr']; ?></CODE>
                                        </TD>
                                </TR>
                                <TR bgcolor="#f1f1f1"">
                                        <TD align="left">
                                                <CODE><NOBR>Класс пользователя</NOBR></CODE>
                                        </TD>
                                        <TD align="left">
                                                <CODE><?php echo $HTTP_GET_VARS['srcclass']; ?></CODE>
                                        </TD>
                                </TR>

                                <TR bgcolor="#f1f1f1"">
                                        <TD align="left">
                                                <CODE>Запрошенный URL</CODE>
                                        </TD>
                                        <TD align="left">
                                                <CODE><?php echo substr($HTTP_GET_VARS['url'],0,60); ?></CODE>
                                        </TD>
                                </TR>


<?php

?>

                                <TR bgcolor="white">
                                        <TD align="center" colspan="2">
                                                <CODE>&nbsp;</CODE>
                                        </TD>
                                </TR>

<?php
// В зависимости от причины прихода - выводим разный низ таблицы.
if($HTTP_GET_VARS['srcclass'] == 'overhead'){ // причина: превышен лимит
// Запрашиваем текущее состояние траффика юзера и лимит.
// Обрабатываем переменную с именем пользователя
$user_name = ereg_replace("[^a-zA-Z0-9_.-]", "", $HTTP_GET_VARS['clientident']);
// Строим запрос к БД
$sql = "SELECT `user_limits`.*,`user_traffic`.`user_traffic`
        FROM `user_limits`, `user_traffic`
        WHERE `user_limits`.`user_name` = `user_traffic`.`user_name`
        AND `user_limits`.`user_name` = '$user_name'";
// проводим кверю
$array_user_data = mysql_fetch_array(mysql_query("$sql"));
// Выводим низ таблицы про превышение лимита:
?>

                                <TR bgcolor="#f1f1f1"">
                                        <TD align="center" colspan="2">
                                                <CODE><H4>У вас превышен лимит траффика!</H4></CODE>
                                        </TD>
                                </TR>
                                <TR bgcolor="#f1f1f1"">
                                        <TD align="left">
                                                <CODE>Лимит (Мб)</CODE>
                                        </TD>
                                        <TD align="left">
                                                <CODE><?php echo round($array_user_data['user_limit']/(1024*1024)); ?></CODE>
                                        </TD>
                                </TR>
                                <TR bgcolor="#f1f1f1"">
                                        <TD align="left">
                                                <CODE>Израсходовано (Мб)</CODE>
                                        </TD>
                                        <TD align="left">
                                                <CODE><?php echo round($array_user_data['user_traffic']/(1024*1024)); ?></CODE>
                                        </TD>
                                </TR>

                                <TR bgcolor="#f1f1f1"">
                                        <TD align="left">
                                                <CODE>Перерасход (Мб)</CODE>
                                        </TD>
                                        <TD align="left">
                                                <CODE><?php echo round(($array_user_data['user_traffic'] - $array_user_data['user_limit'])/(1024*1024)); ?><
/CODE>
                                        </TD>
                                </TR>

                                <TR bgcolor="white">
                                        <TD align="center" colspan="2">
                                                <CODE>&nbsp;</CODE>
                                        </TD>
                                </TR>

                                <TR bgcolor="#f1f1f1"">
                                        <TD align="left" colspan="2">
                                                <CODE>Если у вас имеются какие-то вопросы, свяжитесь с вашим непосредственным начальством, или Натальей Коче
тковой, по внутренней аське, или телефону.</CODE>
                                        </TD>
                                </TR>



<?php
}else{ // причина: превышен лимит --> иная причина
// выводим низ таблицы про запрет доступа
?>

                                <TR bgcolor="#f1f1f1"">
                                        <TD align="center" colspan="2">
                                                <CODE><H4>Доступ к этому сайту запрещён.</H4></CODE>
                                        </TD>
                                </TR>
                                <TR bgcolor="#f1f1f1"">
                                        <TD align="left">
                                                <CODE>Причина запрета</CODE>
                                        </TD>
                                        <TD align="left">
                                                <CODE><?php echo $HTTP_GET_VARS['targetclass']; ?></CODE>
                                        </TD>
                                </TR>


                                <TR bgcolor="white">
                                        <TD align="center" colspan="2">
                                                <CODE>&nbsp;</CODE>
                                        </TD>
                                </TR>

                                <TR bgcolor="#f1f1f1"">
                                        <TD align="left" colspan="2">
                                                <CODE>Если вам действительно нужен доступ к этому сайту, свяжитесь с вашим непосредственным начальством.</CO
DE>
                                        </TD>
                                </TR>


<?php
} // причина: иная причина - закрытие.



?>


                        </TBODY>
                        </TABLE>
                </TD>
        </TR>
</TBODY>
</TABLE>
</FORM>
<br><br>
</BODY>
</HTML>






<?php

?>
Убей их всех! Бог потом рассортирует...

kunaksergey
рядовой
Сообщения: 28
Зарегистрирован: 2007-06-18 8:39:15

Непрочитанное сообщение kunaksergey » 2007-06-12 17:12:21

прочитал-прослезился.

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

Непрочитанное сообщение Alex Keda » 2007-06-12 17:31:31

kunaksergey писал(а):прочитал-прослезился.
это ты к чему...
Убей их всех! Бог потом рассортирует...

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

Непрочитанное сообщение Alex Keda » 2007-06-12 17:37:31

и убери автоответчик с ящика.
ответы на сообщения форума идут мне.
Убей их всех! Бог потом рассортирует...

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

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

народ, есть вопрос. а как мона вот такие скрипты, самописные завязать на логирование?
типа что-то вроде сислога что ли...
ядерный взрыв...смертельно красиво...жаль, что не вечно...

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

Непрочитанное сообщение Alex Keda » 2007-06-25 19:06:52

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

man logger
LOGGER(1)               FreeBSD General Commands Manual              LOGGER(1)

NAME
     logger -- make entries in the system log

SYNOPSIS
     logger [-46Ais] [-f file] [-h host] [-P port] [-p pri] [-t tag]
            [message ...]

DESCRIPTION
     The logger utility provides a shell command interface to the syslog(3)
     system log module.

     The following options are available:

     -4      Force logger to use IPv4 addresses only.

     -6      Force logger to use IPv6 addresses only.

     -A      By default, logger tries to send the message to only one address,
             even if the host has more than one A or AAAA record.  If this
             option is specified, logger tries to send the message to all
             addresses.

     -i      Log the process id of the logger process with each line.

     -s      Log the message to standard error, as well as the system log.

     -f file
             Log the specified file.

     -h host
             Send the message to the remote system host instead of logging it
             locally.

     -P port
             Send the message to the specified port number on a remote system,
             which can be specified as a service name or as a decimal number.
             The default is ``syslog''.  If an unknown service name is used,
             logger prints a warning and falls back to port 514.

     -p pri  Enter the message with the specified priority.  The priority may
             be specified numerically or as a ``facility.level'' pair.  For
             example, ``-p local3.info'' logs the message(s) as informational
             level in the local3 facility.  The default is ``user.notice.''

     -t tag  Mark every line in the log with the specified tag.

     message
             Write the message to log; if not specified, and the -f flag is
             not provided, standard input is logged.

EXIT STATUS
     The logger utility exits 0 on success, and >0 if an error occurs.

EXAMPLES
           logger System rebooted

           logger -p local0.notice -t HOSTIDM -f /dev/idmc

SEE ALSO
     syslog(3), syslogd(8)

STANDARDS
     The logger command is expected to be IEEE Std 1003.2 (``POSIX.2'') com-
     patible.

FreeBSD 6.2                     August 2, 2006                     FreeBSD 6.2
Убей их всех! Бог потом рассортирует...

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

Непрочитанное сообщение Alex Keda » 2007-06-26 16:24:06

вот, развлекался тут - автоматически разбивает диск, вводит в домен, правиит конфиги...
заточено подд работу с флэшкой

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

#!/bin/sh

cd /tmp && rm -Rf * >/dev/null 2>&1

case $1 in
        stop)
        exit;
        ;;
        *)
        clear;
        echo > /tmp/rc.conf.jail
        /usr/sbin/ntpdate my-domain-name.local >/dev/null 2>&1 &
        ;;
esac


# rm tmp files
tmp_dir="/tmp/install"
/bin/rm -Rf ${tmp_dir}
/bin/mkdir -p ${tmp_dir}

# variables
root_size="256"         # Mb    384
swap_size="128" # Mb    1024
usr_size="2048"         # Mb    4096
var_size="1024"         # Mb    4096

# distrib directory
dist_dir="/dist/dist"

# debug - on = 1; off = 2
debug="2"
# install new server

# prompt user - restore or not?
echo "




!!!!!  Внимание  !!!!!
Если вы не понимаете что делаете, выньше флэшку и перезагрузите сервер.
Если вы введёте YES, начнётся инсталляция нового сервера, и все данные
содержащиеся на жёстком диске будут утеряны. Если вы введёте NO, установка
будет прервана, и произойдёт автоматическая перезагрузка.

Если вы не создали в BIOS контроллера массив (для сервера), введите NO
и создайте его, после этого, заново начните установку."
echo -n "Хотите ли вы начать установку: "
read answer
# verify answer
case ${answer} in
        [Yy][Ee][Ss])
        # согласен. продолжаем
        echo""
        echo "Инсталляция нового сервера запущена!"
        ;;
        *)
        # передумал :)
        echo "Вы ответили '${answer}'. Сервер перезагружается..."
        shutdown -r now
        exit;
        ;;
esac

# select - what installing
echo -n "

Для инсталляции почтового/файлового сервера введите 'S',
для инсталляции сервера архивации введите 'B'.
Введите ваш выбор:"
read server_type
case ${server_type} in
        [Ss])
        # сервак
        echo""
        echo "Инсталляция нового файлового/почтового сервера запущена!"
        echo "1" > ${tmp_dir}/server_type.txt
        ;;
        [Bb])
        # бэкап
        echo "Инсталляция нового сервера архивации запущена!"
        echo "2" > ${tmp_dir}/server_type.txt
        ;;
esac
server_type="`/bin/cat ${tmp_dir}/server_type.txt`"


input_function() {
# input name new server
echo "
Для успешной инсталляции, ответтьте пожалуйста на несколько вопросов

Введите имя сервера (имя вводится без доменного суффикса)."
echo -n "Имя: "
read server_name_user
server_name="`echo ${server_name_user} | /usr/bin/tr '[:upper:]' '[:lower:]'`"
# проверяем введённое
if [ ${server_name}x = 'x' ]
then
        # пустое имя.
        server_name="default"
fi
# input IP new server
echo -n "Введите IP адрес этого сервера: "
read server_IP
# проверяем введённое
if [ ${server_IP}x = 'x' ]
then
        # пустой адрес.
        server_IP="172.31.0.10"
fi
# input IP default gateway
echo -n "Введите адрес шлюза: "
read gateway_IP
if [ ${gateway_IP}x = 'x' ]
then
        # пустой гейт
        gateway_IP="172.31.0.1"
fi
# input IP default gateway
if [ ${server_type} -eq 1 ]; then
echo -n "Введите адрес сервера backup: "
read backup_IP
if [ ${backup_IP}x = 'x' ]
then
        # пустой гейт
        backup_IP="172.31.0.1"
fi
fi

# input admin user login
echo -n "Введите логин администратора филиала: "
read user_login
if [ ${user_login}x = 'x' ]
then
        # пустой логин
        user_login="lissyara"
fi
# input admin user login
echo -n "Введите ВАШ логин в домене: "
read user_join_login
if [ ${user_join_login}x = 'x' ]
then
        # пустой логин
        user_join_login="akeda"
fi
# input admin user login
echo -n "Введите OU филиала: "
read filial_OU
if [ ${filial_OU}x = 'x' ]
then
        # пустой логин
        user_login="chelyabinsk"
fi

echo "
Вы ввели следующие сведения:
Имя сервера:                    ${server_name}
IP сервера:                     ${server_IP}
IP шлюза:                       ${gateway_IP}"
if [ ${server_type} = 1 ]; then
echo "IP сервера backup:                ${backup_IP}"
fi
echo "Логин администратора филиала:     ${user_login}
Ваш доменный логин:             ${user_join_login}
OU филиала:                     ${filial_OU}
"
# input user answer - correct or not data?
echo "Если эти данные верны, введите YES, в противном случае, введите NO"
echo -n "Ваш ответ: "
read result_code
# verify answer
echo -n > ${tmp_dir}/rezult.code.user.input
case ${result_code} in
        [Yy][Ee][Ss])
        # согласен. продолжаем
        echo""
        echo "Вы ввели верные данные. Инсталляция продолжается.!"
        echo "1" > ${tmp_dir}/rezult.code.user.input
        ;;
        *)
        # передумал :)
        echo "Вы ответили '${result_code}'. Повторный ввод данных"
        echo "no" > ${tmp_dir}/rezult.code.user.input
        ;;
        esac

}       # end input function


while test 1 -eq 1
do
        # вводим данные.
        /usr/bin/touch ${tmp_dir}/rezult.code.user.input
        read rezult_code < ${tmp_dir}/rezult.code.user.input
        if [ ${rezult_code}x = 1x ]
        then
                # данные введены верные. считываем переменные.
                #echo "имя серванта ${server_name}"
                break
        else
                # либо данные не введены, либо они неверные
                input_function
        fi
done


# debug - skip restore
#if [ 2 -eq 1 ]; then


# detecting hdd on server
kernel_disks="`/sbin/sysctl kern.disks | awk -F ':' '{print $2}'`"
#kern.disks: da1 da0
if [ ${debug} -eq 1 ] ; then
echo "DEBUG: 1. kernel disks = ${kernel_disks}" ; fi
# cycle for all disks - count and match
i=0
for all_disks in ${kernel_disks}
do
        # detecting disk type
        disk_type="`echo ${all_disks} | /usr/bin/tr -d '[0-9]'`"
        # detecting disk number
        disk_number="`echo ${all_disks} | /usr/bin/tr -d '[a-z]'`"
        # find ATA|SATA disks
        if [ ${disk_type} = "ad" ]
        then
                # ATA/SATA disks
                echo " detected ATA/SATA disks! "
                echo "${all_disks}" > ${tmp_dir}/ata_disk.tmp
        else
                /usr/bin/touch ${tmp_dir}/ata_disk.tmp
        fi
        # SCSI device
        if [ ${all_disks} = "da1" ]
        then
                # found 1 SCSI disk (da0 - disk, da1 - flash)
                echo " detected SCSI disks! "
                echo "da0" > ${tmp_dir}/scsi_disk.tmp
        else
                /usr/bin/touch ${tmp_dir}/scsi_disk.tmp
        fi
        # detecting - how many SCSI disks on machine
#       for ii in 0 1 2 3 4 5 6 7 8 9
#       do
#               if [ ${all_disks} = da${ii} ]
#               then
#                       # count $i + 1 - line in file
##                      echo da${ii} >> ${tmp_dir}/disks_count.tmp
#               fi
#       done
        # up counter +1
        i="`/bin/expr $i + 1`"
done
#number_SCSI_disks="`cat ${tmp_dir}/disks_count.tmp | /usr/bin/wc -l | /usr/bin/tr -d ' '`"
#if [ ${debug} -eq 1 ] ; then
#echo "DEBUG: 2. number SCSI disks = ${number_SCSI_disks}" ; fi
# if $number_SCSI_disks = 1 - exit - only flash detected
#if [ ${number_SCSI_disks} -eq 1 ]
#then
        # exit
#       echo " Fatal: SCSI disks not detected!"
#       exit;
#fi
# scsi disks detected. da0 - disk for work

# disk counter. Current - number disk = 2; else - shutdown - error - no disks
# future - number disk = 3 (add RAM disk)
if [ $i -eq 2 ]
then
        # all OK
else
        # no disks?
        echo " HDD drive not found... System shutdown..."
        /bin/sleep 5 && /sbin/shutdown -p now && exit;
fi
# select disk for work
if [ `/usr/bin/wc -l ${tmp_dir}/ata_disk.tmp | awk '{print $1}'` -eq 1 ]
then
        # found ATA disk
        work_device="`/bin/cat ${tmp_dir}/ata_disk.tmp`"
else
        # ATA not found - work on SCSI
        work_device="`/bin/cat ${tmp_dir}/scsi_disk.tmp`"
fi


#exit
# fdisk
echo "Creating partitions..."
#/sbin/fdisk -f ${dist_dir}/fdisk.config -b -I -v /dev/da0 >/dev/null 2>&1
/sbin/fdisk -I -i -B /dev/${work_device}

echo "# /dev/${work_device}s1:
8 partitions:
#       size    offset  fstype  [fsize  bsize   bps/cpg]
a:      ${root_size}M   0       4.2BSD  2048    16384   32776
b:      ${swap_size}M   *       swap
c:      *       0       unused  0       0               # "raw" part, don't edit
d:      ${usr_size}M    *       4.2BSD  2048    16384   28528
e:      ${var_size}M    *       4.2BSD  2048    16384   28528
f:      *               *       4.2BSD  2048    16384   28552   # /shares - all remaining space
" > ${tmp_dir}/bsdlabel.txt


# bsdlabel
/sbin/bsdlabel -R ${work_device}s1 ${tmp_dir}/bsdlabel.txt >/dev/null 2>&1
/sbin/bsdlabel -B ${work_device}s1 >/dev/null 2>&1
# newfs
echo "Creating filesystems..."
/sbin/newfs /dev/${work_device}s1a      >/dev/null 2>&1 # /
/sbin/newfs /dev/${work_device}s1f      >/dev/null 2>&1 # /shares
/sbin/newfs /dev/${work_device}s1d      >/dev/null 2>&1 # /usr
/sbin/newfs /dev/${work_device}s1e      >/dev/null 2>&1 # /var
# tunefs
echo "Settings filesystems parameters..."
/sbin/tunefs -n enable /dev/${work_device}s1f   >/dev/null 2>&1 # softupdates
/sbin/tunefs -a enable /dev/${work_device}s1f   >/dev/null 2>&1 # ACLs
/sbin/tunefs -n enable /dev/${work_device}s1d   >/dev/null 2>&1 # softupdates
/sbin/tunefs -n enable /dev/${work_device}s1e   >/dev/null 2>&1 # softupdates


# restore /
echo "Restoring '/' filesystems..."
/sbin/mount /dev/${work_device}s1a /mnt
cd /mnt
/usr/bin/bunzip2 --stdout ${dist_dir}/root.dump.bz2 | /sbin/restore -rf -       >/dev/null 2>&1
# restore /usr
echo "Restoring '/usr' filesystems..."
/sbin/mount /dev/${work_device}s1d /mnt/usr
cd /mnt/usr
/usr/bin/bunzip2 --stdout ${dist_dir}/usr.dump.bz2 | /sbin/restore -rf -        >/dev/null 2>&1
# restore /var
echo "Restoring '/var' filesystems..."
/sbin/mount /dev/${work_device}s1e /mnt/var
cd /mnt/var
/usr/bin/bunzip2 --stdout ${dist_dir}/var.dump.bz2 | /sbin/restore -rf -        >/dev/null 2>&1
# restore /shares
echo "Restoring '/shares' filesystems..."
/sbin/mount /dev/${work_device}s1f /mnt/shares
cd /mnt/shares
/usr/bin/bunzip2 --stdout ${dist_dir}/shares.dump.bz2 | /sbin/restore -rf -     >/dev/null 2>&1

echo "All filesystems restored!"

# sync disks
sync
# end debug
#fi


# extract interface name (short; up)
for interface in `/sbin/ifconfig -l -u`
do
        # test interface name
        if [ ${interface} = "lo0" ]
        then
                # none
        else
                interface_name="${interface}"
        fi
done


# применяем введённые данные
# редактируем конфиги
echo "Applying new settings..."
for config in "etc/rc.conf" "etc/hosts" "usr/local/etc/exim/configure"
do
# server name
/usr/bin/sed -e "s/testsrv/${server_name}/g" /mnt/${config} \
        > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/${config}
# server IP
/usr/bin/sed -e "s/172.31.0.10/${server_IP}/g" /mnt/${config} \
        > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/${config}
# router IP $gateway_IP
/usr/bin/sed -e "s/172.31.0.1/${gateway_IP}/g" /mnt/${config} \
        > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/${config}
done
# smb.conf
server_name_UPPER="`echo ${server_name} | /usr/bin/tr '[:lower:]' '[:upper:]'`"
/usr/bin/sed -e "s/TESTSRV/${server_name_UPPER}/g" /mnt/usr/local/etc/smb.conf \
        > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/usr/local/etc/smb.conf
# Admin_testfil
/usr/bin/sed -e "s/admin_testfil/${user_login}/g" /mnt/usr/local/etc/smb.conf \
        > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/usr/local/etc/smb.conf
# filial OU (in AD)
/usr/bin/sed -e "s/testfil/${filial_OU}/g" /mnt/usr/local/etc/exim/includes/filials_macros.conf \
        > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/usr/local/etc/exim/includes/filials_macros.conf

# emai alias for admin
echo "" >> /mnt/etc/aliases
echo "#filial admin email" >> /mnt/etc/aliases
echo "${user_login}:    ${user_login}@my-domain-name.local" >> /mnt/etc/aliases
/usr/bin/sed -e "s/lissyara,dag/lissyara,dag,${user_login}/g" /mnt/etc/aliases \
        > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/etc/aliases


# settings for backup server
/usr/bin/sed -e "s/da0/${work_device}/g" /mnt/etc/fstab \
        > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/etc/fstab
if [ ${server_type} -eq 2 ]
then
        /usr/bin/sed -e "s/bce0/${interface_name}/g" /mnt/etc/rc.conf \
                > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/etc/rc.conf
        /usr/bin/sed -e "s/dovecot_enable=\"YES\"//g" /mnt/etc/rc.conf \
                > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/etc/rc.conf
        /usr/bin/sed -e "s/squid_enable=\"yes\"//g" /mnt/etc/rc.conf \
                > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/etc/rc.conf
        /bin/cp ${dist_dir}/exim.conf /mnt/usr/local/etc/exim/configure
        /usr/bin/sed -e "s/clamav_clamd_enable=\"YES\"//g" /mnt/etc/rc.conf \
                > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/etc/rc.conf
fi


sync

# debug - end skip restore
#fi

# new IP for jail
first_octet="`echo ${server_IP} | awk -F '.' '{print $1}'`"
second_octet="`echo ${server_IP} | awk -F '.' '{print $2}'`"
third_octet="`echo ${server_IP} | awk -F '.' '{print $3}'`"
fourth_octet="`echo ${server_IP} | awk -F '.' '{print $4}'`"
new_fourth_octet="`expr ${fourth_octet} - 1`"

alias_IP="${first_octet}.${second_octet}.${third_octet}.${new_fourth_octet}"

# alias - for jail
killall -9 dhclient >/dev/null 2>&1
sleep 1;
/sbin/ifconfig ${interface_name} inet ${server_IP} netmask 255.255.255.0
/sbin/ifconfig ${interface_name} alias ${alias_IP}
/sbin/route add default ${gateway_IP} >/dev/null 2>&1

# dev - for jail
/sbin/mount_devfs devfs /mnt/dev

# crating config for jail
#echo "# jails config
## Generic settings for JAILS
#jail_enable=\"YES\"
#jail_list=\"${server_name}\"
#jail_set_hostname_allow=\"YES\"
#jail_${server_name}_rootdir=\"/mnt\"
#jail_${server_name}_hostname=\"${server_name}\"
#jail_${server_name}_ip=\"${alias_IP}\"
#jail_${server_name}_procfs_enable=\"YES\"
#jail_${server_name}_devfs_enable=\"YES\"
#jail_${server_name}_flags=\"-l -U root\"


#" > /tmp/rc.conf.jail

# startting jails
#echo "starting jail for join in domain"
#/etc/rc.d/jail stop >/dev/null 2>&1
#/etc/rc.d/jail start >/dev/null 2>&1
#sleep 2;

# creating script for kinit
echo "#!/bin/sh
# killall services
#/usr/bin/killall -9 squid >/dev/null 2>&1
#/etc/rc.d/syslogd stop >/dev/null 2>&1
/bin/sleep 2
/usr/bin/kinit ${user_join_login}
" > /mnt/shares/tmp/kinit.sh
chmod 777 /mnt/shares/tmp/kinit.sh
# kerberos
echo "
Введите ВАШ доменный пароль для получения билета Kerberos:"
/usr/sbin/jail /mnt ${server_name} ${alias_IP} /shares/tmp/kinit.sh

# ifconfig down/up
#/sbin/ifconfig bce0 down
#sleep 1;
#ifconfig bce0 up
#sleep 1;

# creating script for net join
echo "#!/bin/sh
#/usr/local/etc/rc.d/samba restart >/dev/null 2>&1
sleep 1;
/usr/local/bin/net join -U ${user_join_login}
" > /mnt/shares/tmp/net_join.sh
chmod 777 /mnt/shares/tmp/net_join.sh
# join in domain
echo "
Введите ВАШ доменный пароль для ввода машины в домен:"
/usr/sbin/jail /mnt ${server_name} ${alias_IP} /shares/tmp/net_join.sh

# clear jail file
echo "# empty file" > /tmp/rc.conf.jail



echo "All done! Rebooting..."

# reboot
#/bin/sleep 5 && /sbin/shutdown -r now

exit;
Убей их всех! Бог потом рассортирует...

Аватара пользователя
proxy-man
лейтенант
Сообщения: 692
Зарегистрирован: 2006-04-05 12:06:13
Откуда: Odessa
Контактная информация:

Непрочитанное сообщение proxy-man » 2007-06-27 15:07:16

Самоделка для бана хостов, с которых пытаются заползти левыми пользователями по ssh

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

#!/usr/local/bin/zsh
#####################################################
# This script closes illegal attempts of login into #
# system and adds the essential rule to firewall    #
#####################################################
# vars #

CAT="/bin/cat"
GREP="/usr/bin/grep"
AWK="/usr/bin/awk"
UNIQ="/usr/bin/uniq"
LOG="/var/log/auth.log"
FIREWALL="/etc/rc.firewall"
FDENY="/etc/deny_hosts"
##############################################
# parsing the log file and creatina an array #

ARR=(`${CAT} ${LOG}|${GREP} 'Invalid user'|${AWK} '{print $10}'|${UNIQ}`)
################################################################
# create function for add data from an array to a special file #
f_deny(){
        for names in ${ARR}; do
                echo $names >> ${FDENY}
        done
}
############################################################
# check if a file for deny hosts exists and start function #

if [ -e ${FDENY} ]; then
        f_deny
else
        touch ${FDENY}
        f_deny
fi
####################
# restart firewall #

${IPFW} flush && /bin/sh < /etc/rc.firewall &


а самом фаервольном скрипте есть функция которая парсит файлег с забанеными хостами и создает рулы для режекта хостов... приблизительно выглядит так

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

host_deny(){
        HostsDeny="`/bin/cat /etc/deny_hosts`"
        for hosts in ${HostsDeny}; do
                ${FwCMD} add deny all from ${hosts} to me
        done
}
нужно конечно придумать эксепшены для собственных адресов, мало ли пользователем ошибся :) , думаю что можно просто в фаервольный скрипт забить массив своих адресов и загружать это правило перед рулом host_deny... хотя это получилось что-то вроде велосипеда )))
ЗЫ - я использую zsh, но адаптировать под другой командный интерпретатор я думаю труда не составит )))
Have trouble with Windows - reboot,
Have trouble with Unix - be root!

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

Непрочитанное сообщение Alex Keda » 2007-06-27 15:28:52

в начало функции добавь

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

touch /etc/deny_hosts
Убей их всех! Бог потом рассортирует...

Аватара пользователя
proxy-man
лейтенант
Сообщения: 692
Зарегистрирован: 2006-04-05 12:06:13
Откуда: Odessa
Контактная информация:

Непрочитанное сообщение proxy-man » 2007-07-03 18:02:26

заменил свою "самоделку" предназначенную для бана хостов, которые под левыми юзреми ломятся на ssh :D - выглядит теперь так:

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

#!/usr/local/bin/zsh
#####################################################
# This script closes illegal attempts of login into #
# system and adds the essential rule to firewall    #
#####################################################
# vars #

CAT="/bin/cat"
GREP="/usr/bin/grep"
AWK="/usr/bin/awk"
UNIQ="/usr/bin/uniq"
WC="/usr/bin/wc"
LOG="/usr/SHELL/auth.log"
FIREWALL="/etc/rc.firewall"
FDENY="/usr/SHELL/deny_hosts"
IPFW="/sbin/ipfw"
##############################################
# parsing the log file and creatina an array #

ARR=(`${CAT} ${LOG}|${GREP} 'Invalid user *'|${AWK} '{print $10}'|${UNIQ}`)

################################################################
# create function for add data from an array to a special file #
f_deny(){
        for name in ${ARR}; do
	# if IP exists into the file - stop procedure
	COUNT=`${CAT} ${FDENY}|${AWK} "/${name}$/"|${WC} -l`
                 if [ ${COUNT} -ge "1" ]; then
			continue
		else
                        # if IP doesn't exist - put it into the file
                	echo $name >> ${FDENY}
		fi
        done
}
############################################################
# check if a file exists for deny hosts and start function #

if [ -e ${FDENY} ]; then
        f_deny
else
        touch ${FDENY}
        f_deny
fi
####################
# restart firewall #

${IPFW} -f flush && /bin/sh < /etc/rc.firewall &

Хотя моя мысль, что такие вещи лучше писать на perl-е ибо у последнего больше вариантов при работе с регулярными выражениями ))
Have trouble with Windows - reboot,
Have trouble with Unix - be root!

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

Непрочитанное сообщение Alex Keda » 2007-07-03 23:24:49

скрипт запуска kdm (манагер иксов)
переделан из стартовго скрипта exim - что называется - наколенней некуда :))
/usr/local/etc/rc.d/kdm

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

#!/bin/sh
#
# $FreeBSD: ports/mail/exim/files/exim.sh.in,v 1.1 2007/05/28 20:52:13 krion Exp $
#

# PROVIDE: mail
# REQUIRE: DAEMON
# KEYWORD: shutdown
#       we make mail start late, so that things like .forward's are not
#       processed until the system is fully operational

#
# Add the following lines to /etc/rc.conf to enable exim:
#
#exim_enable="YES"
#
# See exim(8) for flags
#

. /etc/rc.subr

name="kdm"
rcvar=`set_rcvar`

command="/usr/local/bin/kdm-bin"
pidfile=/var/run/kdm.pid
#required_dirs=/var/log/exim
#required_files=/usr/local/etc/exim/configure

#start_precmd=start_precmd
stop_postcmd=stop_postcmd

#extra_commands="reload"

#start_precmd()
#{
#  case $sendmail_enable in
#  [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
#    warn "sendmail_enable should be set to NONE"
#    ;;
#  [Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|[Oo][Ff][Ff]|0)
#    case $sendmail_submit_enable in
#    [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
#      warn "sendmail_submit_enable should be set to NO"
#      ;;
#    esac
#    ;;
#  [Nn][Oo][Nn][Ee])
#    ;;
#  esac
#}

stop_postcmd()
{
  rm -f $pidfile
}

# read settings, set default values
load_rc_config $name
: ${kdm_enable="NO"}
#: ${exim_flags="-bd -q30m"}

run_rc_command "$1"
разумеется, требуется переменная в rc.conf - как для всех приложений :)
Убей их всех! Бог потом рассортирует...

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

Непрочитанное сообщение Alex Keda » 2007-07-04 20:29:45

мдя... а с новым kde догадались-таки засунуть стартовый скрипт :)))
однако - это остаётся как пример того, что можно сделать :)
Убей их всех! Бог потом рассортирует...

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

Непрочитанное сообщение Alex Keda » 2007-07-05 19:12:20

не нашёл способа узнать - как получить список установленных портов, от которых не зависят другие (чтоб ненужные поудалять - нефиг им болтаться)

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

#!/bin/sh

/usr/sbin/pkg_info | /usr/bin/awk '{print $1}' |
{
while read pkg_name
do
requred="`/usr/sbin/pkg_info -R ${pkg_name}     |       \
        /usr/bin/grep Required | /usr/bin/wc -l |       \
        /usr/bin/tr -d ' '`"

#echo  "${requred} ${pkg_name}"

if [ ${requred} = "0" ]
then
        # not needed
        echo "Pkg: ${pkg_name} - not needed"
fi
done
}
кстати - оказалось что половина установленного ПО на тестовой машине - нафик не нужна, а я всё обновляю и обновляю :)
Убей их всех! Бог потом рассортирует...