Shell Мониторинг
Вначале несколько слов о команде find :
Формат команды: find <список поиска> <выражение>
Find рекурсивно просматривает директории для каждого эле-
мента списка поиска, отыскивая файлы, удовлетворяющие логичес-
кому <выражению>, записанному с помощью приведенных ниже прими-
тивов. В их описаниях n используется как целое десятичное чис-
ло, +n означает больше, чем n, -n - меньше, чем n.
-name <файл> истина, если текущий файл удовлетворяет шаблону
<файл>
-perm onum истина, если код защиты файла в точности равен
onum (см. chmod)
-type c истина, если тип файла c, где c - b, c, d, p,
или f - блок- или символьноориентированный спе-
циальный файл, директория, канал (pipe) или
обычный файл
-links n истина, если файл имеет n связей
-user uname истина, если UID файла совпадает с uname
-group gname истина, если GID файла совпадает с gname
-size n[c] истина, если файл занимает n блоков (по 512
байт). Если указана буква c, то размер файла
задается в символах
-atime n истина, если файл не читался в последние n дней
-mtime n истина, если файл не модифицировался в послед-
ние n дней
-ctime n истина, если права доступа к файлу не менялись
в последние n дней
-exec cmd истина, если после выполнения команды cmd возв-
ращается нулевой код возврата. Cmd может закан-
чиваться точкой с запятой, которая должна быть
экранирована. Аргумент команды {} заменяется
именем текущего файла
-ok cmd то же, что и exec, за исключением того, что
перед выполнением cmd запрашивается подтвержде-
ние и cmd выполняется только при ответе y
-print всегда истина; выводит имя файла
(выражение) истина, если истинно заключенное в скобки выра-
жение (скобки должны быть экранированы)
Примитивы могут комбинироваться с помощью следующих опера-
ций (в порядке уменьшения приоритета):
1) Отрицание (! - унарная операция NOT)
2) Конкатенация (операция AND, обозначается пробелом)
3) Выбор (-о - операция OR)
Пример. Удалить все файлы с именами a.out или *.o, которые
не открывались в течение недели:
find / \( -name a.out -o -name '*.o' \) -atime +7 -exec rm {} \;
Следующий скрипт выполняет следующие действия :
1. Проверяет изменения в системных файлах
/etc/passwd
/etc/shadow
/etc/group
2. Проверяет , какие файлы были изменены в последнее время в каталоге
/etc
3. Выводит статистику о смонтированных файловых системах .
4. Выводит сетевую информацию .
Скрипт запускается в каталоге /0 .
#!/bin/sh
PATH=/bin:/usr/bin:/sbin:/usr/sbin
LC_ALL=C; export LC_ALL
LANG=C; export LANG
umask 077
N_weekday=`date +"%w"`
DATE=`date +"%d/%m/%Y %H:%M"`
bak=/0
TMPDIR=/0
TMPMAIL=/0/reports
CONFIGDIRS="/etc/"
echo "" >$TMPMAIL
echo "Checking passwd:" >>$TMPMAIL
if [ ! -f $bak/passwd.bak ] ; then
echo "no $bak/passwd.bak" >>$TMPMAIL
cp -p /etc/passwd $bak/passwd.bak 2>&1 >>$TMPMAIL
fi
if cmp -s /0/passwd.bak /etc/passwd; then :; else
echo "$host passwd diffs:" >>$TMPMAIL
diff /0/passwd.bak /etc/passwd |\
sed 's/^\([<>] [^:]*\):[^:]*:/\1:(password):/' >>$TMPMAIL
mv $bak/passwd.bak $bak/passwd.bak2 2>&1 >>$TMPMAIL
cp -p /etc/passwd $bak/passwd.bak 2>&1 >>$TMPMAIL
fi
echo "done" >>$TMPMAIL
echo "Checking shadow:" >>$TMPMAIL
# Shadow
if [ ! -f $bak/shadow.bak ] ; then
echo "no $bak/shadow.bak" >>$TMPMAIL
cp -p /etc/shadow $bak/shadow.bak 2>&1 >>$TMPMAIL
fi
if cmp -s $bak/shadow.bak /etc/shadow; then :; else
echo "$host shadow diffs:" >>$TMPMAIL
diff $bak/shadow.bak /etc/shadow |\
sed 's/^\([<>] [^:]*\):[^:]*:/\1:(password):/' >>$TMPMAIL
mv $bak/shadow.bak $bak/shadow.bak2 2>&1 >>$TMPMAIL
cp -p /etc/shadow $bak/shadow.bak 2>&1 >>$TMPMAIL
fi
echo "done" >>$TMPMAIL
echo "Checking group:" >>$TMPMAIL
# Groups
if [ ! -f $bak/group.bak ] ; then
echo "no $bak/group.bak" >>$TMPMAIL
cp -p /etc/group $bak/group.bak 2>&1 >>$TMPMAIL
fi
if cmp -s $bak/group.bak /etc/group; then :; else
echo "$host group diffs:" >>$TMPMAIL
diff -u $bak/group.bak /etc/group >>$TMPMAIL
mv $bak/group.bak $bak/group.bak2 2>&1 >>$TMPMAIL
cp -p /etc/group $bak/group.bak 2>&1 >>$TMPMAIL
fi
echo "done" >>$TMPMAIL
echo "Checking tcpwrapper config files:" >>$TMPMAIL
for i in hosts.deny hosts.allow ; do
if [ -f /etc/$i ] ; then
if [ ! -f $bak/$i.bak ] ; then
echo "no $bak/$i.bak" >>$TMPMAIL
cp -p /etc/$i $bak/$i.bak 2>&1 >>$TMPMAIL
fi
if cmp -s $bak/$i.bak /etc/$i; then :; else
echo "$host $i diffs:" >>$TMPMAIL
diff -u $bak/$i.bak /etc/$i >>$TMPMAIL
mv $bak/$i.bak $bak/$i.bak2 2>&1 >>$TMPMAIL
cp -p /etc/$i $bak/$i.bak 2>&1 >>$TMPMAIL
fi
fi
done
echo "done" >>$TMPMAIL
find $CONFIGDIRS -mtime -1 -type f -print > $TMPDIR/change.$N_weekday.lst
CHLIST=`cat $TMPDIR/change.$N_weekday.lst`
if [ -n "$CHLIST" ]; then
tar cvfz $BACKUPDIR/$HOSTNAME.$N_weekday $CHLIST >/dev/null 2>/dev/null
cat $TMPDIR/change.$N_weekday.lst >> $TMPMAIL
fi
if [ "$N_weekday" = "$CONFARCDAY" ]; then
rm -f $BACKUPDIR/$HOSTNAME >/dev/null 2>/dev/null
tar cvfz $BACKUPDIR/$HOSTNAME $CONFIGDIRS >/dev/null 2>/dev/null
fi
echo "" >>$TMPMAIL
echo "" >>$TMPMAIL
echo "Checking subsystem status:" >>$TMPMAIL
echo "" >>$TMPMAIL
echo "disks:" >>$TMPMAIL
df -k -l >>$TMPMAIL
echo "" >>$TMPMAIL
echo "mail:" >>$TMPMAIL
echo "" >>$TMPMAIL
echo "network:" >>$TMPMAIL
if [ -x /sbin/ip ]; then
/sbin/ip -s link >>$TMPMAIL
else
netstat -ni >>$TMPMAIL
fi
if [ -d /var/spool/rwho ]; then
if [ -n "`ls -1 /var/spool/rwho/`" ] ; then
A="`ruptime -t`"
if [ -n "$A" ]; then
echo "" >>$TMPMAIL
echo "hosts uptimes:" >>$TMPMAIL
echo "$A" >>$TMPMAIL
fi
fi
fi
|
Влад | немогу понять эту грофу. find $CONFIGDIRS -mtime -1 -type f -print > $TMPDIRchange.$N_weekday.lst 2006-05-10 20:06:53 | Яковлев Се� | find - ищем файлы в каталоге etc
2 параметра команды find :
-mtime -1 - модифицированные в течение последнего дня
-type f - ищем обычные файлы
Куда выводим результата - в файл :
-print > $TMPDIRchange.$N_weekday.lst - результат выводим в файл change.3.lst ,
который лежит в каталоге 0 2006-05-10 22:50:57 | |
|
|