LINUX.ORG.RU

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


0

0

Вообщем тут возникла задача переводить лог сквида в котором прописаны IP в лог в котором ИПы заменены на MAC адресса. Мне получилось отчасти реализовать отдельные элементы а вот всё вместе склеить не получается.

Вот что есть, есть вырезание ИПа

gawk -F' ' '{ print $3 }' /var/log/squid/access.log

он вырезает ИП из лога, затем с помощью

arping -fb IP_ADDRESS

я получаю МАК. Вот на этом я и застопорился. Т.е. по нормально дальше должно быть так:

3. Вырезаю из arping -fb IP_ADDRESS конкретно МАК адресс без постороннего мусора.

4. Делаю беру /var/log/squid/access.log и перевожу его в /var/log/squid/mac_access.log но с изменённым ИПом на МАК. Т.е. копируя его в этот новый файл, подменяем ИП МАКом.

Причём пишется часть лога, т.е. примерно раз в 10 минут выполянется этот скрипт а затем полученные куски склеиваються. Ну к примеру после скрипта имеем кусок NEW его приклеиваем к ALL, т.е. ALL = NEW + ALL.

Если кто может подсказать как это осуществить буду очень и очень благодарен. Помогите просто горю уже.

Заранее спасибо!!!

★★★★★

в awk обратные кавычки работают как и bash, измени параметр 3 и потом выведи всю строку целиком

за правильность не ручаюсь (не проверял), но можно сделать что то вроде:

awk "{$3=`arping -fb $3`; print $0} "

Для увеличения производительности можно кешировать ответы arping в массиве, или закачать их в массив из arpwatch

infinite
()
Ответ на: комментарий от infinite

cyclon alexandr # awk "{$3=`arping -fb $3`; print $0}"
Usage: arping [-fqbDUAV] [-c count] [-w timeout] [-I device] [-s source] destination
  -f : quit on first reply
  -q : be quiet
  -b : keep broadcasting, don't go unicast
  -D : duplicate address detection mode
  -U : Unsolicited ARP mode, update your neighbours
  -A : ARP answer mode, update your neighbours
  -V : print version and exit
  -c count : how many packets to send
  -w timeout : how long to wait for a reply
  -I device : which ethernet device to use (eth0)
  -s source : source ip address
  destination : ask for what ip address
awk: cmd. line:1: {=; print bash}
awk: cmd. line:1:  ^ syntax error

вот что родилось :(

И ещё вопрос, как в эту комбинацию передаётся ИП?

Так же хотелось отметить что кэширование пока не имеет смысла поскольку работа ведёться с 4 компами.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

если всего 4 хоста, то не проще по логу пройтись только точки и прочее не забуть заэкранировать слешами

cat logfile | sed -e s/ip/mac/ > newlog

awk в случае с логами squid не поможет, там второе поле выравнено по правому краю пробелами слева, а как делить записи в этом случае по 1 или по 2 или по 5 пробелов (что ставить в FS)?

infinite
()
Ответ на: комментарий от infinite

Похоже придёться делать так

#!/bin/bash

ping -с 1 -b 192.168.120.255; #посылаем броадкаст
                              #в результате в /proc/net/arp имеем            
                              #таблицу МАКов

exchglog /var/log/squid/access.log; #Вот самое интересное - это прога 
                                    #которую очевидно придёться 
                                    #написать, впринципе это не 
                                    #проблемма.
echo " " > /var/log/squid/access.log #Обнуляем лог

Вот где то так.
Впринципе здесь всё довольно просто. Но уж очень не хоцца использовать такой метод :(

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

а что паритесь-то??? не забудьте поменять только в строке с arping параметр eth0 на имя интерфейса, который смотрит вовнутрь.

#!/usr/bin/perl -w use strict;

open(INLOG, "access.log"); my @log = <INLOG>; close(INLOG);

my %mac = (); my $ip; foreach (@log) { if ($_ =~ /^\S+\s+\S+\s+(\S+)\s/) { $ip = $1; $mac{$ip} = $1 if ((!$mac{$ip}) && (`arping -f -I eth0 $ip | grep "Unicast reply"` =~ /\[(\S+)\]/)); $_ =~ s/$ip/$mac{$ip}/g; } }

open(OUTLOG, ">access.mac"); print OUTLOG @log; close(OUTLOG);

у меня складывается такое впечатление, что это что-то вроде защиты от подмены IP. если так, то почему бы просто не запретить компу, сменившему IP, обращаться к серверу?????

x029ah
()
Ответ на: комментарий от x029ah

дурацкий форум +)
сработает, если поставить перенос перед use strict;

x029ah
()
Ответ на: комментарий от x029ah

Защита это или нет, я не знаю не я дела эту сетку да и работаю я в ней не так давно, простоглавный админ не хочет ничего менять и ставить статику или привязывать маки к ипам.

P.S. Очень благодарен за скрипт, видимо всё таки придёться заняться изучением перла ил чего то такого.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

> cyclon alexandr # awk "{$3=`arping -fb $3`; print $0}"

> awk: cmd. line:1: {=; print bash}

Программу awk надо в _одинарные_ кавычки брать. Так что, не перлом займись, а bash'ем сначала :)

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от watashiwa_daredeska

Сея последовательность была написана не мной а посему я как то в неё не вглядывался.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от x029ah

TO x029ah:

:( Млин не работает твой скрипт, т.е. запускается и тишина, там где ты сказал долбануть по ентеру я долбанул. Но факт на лицо, он стартует и тишина :(

cyclon ★★★★★
() автор топика

не претендует на эталон но все же !

Filename=access.log

line_count=`wc $Filename | awk '{ print $1 }'`

n=0

while [ "$n" != $line_count ]

do read I

IP=`echo $I | awk '{ print $3 }'` MAK=`arping -fbc 1 $IP | grep "\[" | awk '{ print "\""substr($5,2,17)"\"" }'`

echo $I | awk '{print $1" "$2" " '${MAK}'" "$4" "$5" "$6" "$7" "$8 }'

let "n += 1"

done <"$Filename"

sova ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.