Имеется лог-файл /var/log/syslog
с выводом ip-адресов, например, например. SRC=10.158.0.1
.
Я хочу просканировать из этого файла каждый напечатанный адрес в SRC= ...
, а затем сделать запрос с помощью whois (SRC= ...)
.
Этот запрос должен отслеживаться.
Мои попытки неверны и выглядят так в bash-скрипте:
#/bin/bash
while [ 1 ]
do
grep ‘SRC=ip-address’ /var/log/syslog >> /home/$user/topsecret001/pitbull001.txt;
whois ‘SRC=ip-address’ >> /home/$user/topsecret001/pitbull002.txt;
done
Может кто-нибудь помочь с трюком? Как мне определить ip-адрес и как я могу использовать команду whois
с этим ip-адресом?
Вывод / var / log / syslog выглядит здесь следующим образом:
[ 116] http://paste.ubuntu.com/5859332/
Вывод / var / log / syslog выглядит следующим образом - когда есть небольшое предупреждение (как сегодня):
http://paste.ubuntu.com/5862958/
Идея была бы слишком - выполнять whois-запрос, только если в строка системного журнала прокрутки.
Спасибо за ваш вклад. Я узнал кое-что по вашим кодам. Часто решения выглядят проще, чем мы думаем, потому что я думал, что это будет сложнее. Я думаю, что с недавним вкладом энзотиба, этот вопрос уже решен.
см. новый комментарий на сегодня (22 июня 2016 г.) со ссылкой на 16.04:
, поскольку этот bash-скрипт был для времен ipv4 - тогда нужно /etc/sysctl.conf отключить прокомментировал включить ipv4? - тогда этот скрипт будет работать? в противном случае вывод whois больше не похож на предыдущий. Проверили это с раскомментированной строкой 28 и строкой 33 /etc/sysctl.conf - тогда этот bash-скрипт в этом потоке будет работать, но выдает очень мало выходных данных, потому что провайдер включил брандмауэр (из-за no-spy-act?) Таким образом, этим дополнением от 22 июня 2016 года эта тема актуализирована для 16.04
Еще одно решение:
awk '{
for (i = 1; i <= NF; i++)
if ($i ~ /^SRC=/)
print substr($i, 5)
}' /var/log/syslog |
sort -u |
while read ip; do
printf ' === %s ===\n' "$ip"
whois "$ip"
done
Если вы хотите выбрать только строки из syslog
, содержащие строку INVALID STATE
, то приведенный выше код можно изменить следующим образом
awk '/INVALID STATE/ {
for (i = 1; i <= NF; i++)
if ($i ~ /^SRC=/)
print substr($i, 5)
}' /var/log/syslog |
sort -u |
while read ip; do
printf ' === %s ===\n' "$ip"
whois "$ip"
done
Ваш сценарий должен выглядеть следующим образом:
#/bin/bash
grep 'SRC=' /var/log/syslog | awk 'BEGIN {FS="[ \t]+|\\|"} {print $13}' | uniq >> ~/topsecret001/pitbull001.txt
for ip in $(sed -e 's/SRC=//g' ~/topsecret001/pitbull001.txt)
do
whois $ip >> ~/topsecret001/pitbull002.txt
done
Может быть, следующий код является подходящей отправной точкой для вас. Возможно, это не оптимальное решение, но оно делает свою работу.
Он состоит из цикла for по всем строкам вывода команды в $ (). На каждой итерации цикла одна переменная вывода сохраняется в переменной IP. Затем в цикле команда whois вызывается с $ IP - содержимым переменной IP - в качестве аргумента.
Скобки $ () заключают в себе две команды grep: первая ищет IP-адреса с записанным перед ними SRC =, а вторая принимает вывод первой (через канал |) и просто берет Айпи адрес. Флаг -o команды grep заставляет его выводить только совпадающую часть строк вместо полных строк.
Регулярное выражение также не очень элегантно. Он ищет три группы, каждая из которых состоит из одной-трех цифр и точки, а затем снова от одной до трех цифр. Чтобы сделать сценарий читабельным, я решил использовать расширенные регулярные выражения -E. «Обычная» команда grep потребует обратной косой черты перед каждым раундом и фигурной скобкой ...
for IP in \
$(grep -E "SRC=([0-9]{1,3}\.){3}[[0-9]{1,3}" -o /var/log/syslog | \
grep -E "([0-9]{1,3}\.){3}[[0-9]{1,3}" -o);
do whois $IP;
done
Для добавления опции - в случае появления «НЕДЕЙСТВИТЕЛЬНОГО СОСТОЯНИЯ» - будет ли это работать? :
awk '{
for (i = 1; i <= NF; i++)
if ($i ~ /^SRC=/)
print substr($i, 5)
}' /var/log/syslog | sort -u | while read ip;
do
printf ' INVALID STATE ' && printf ' === %s ===\n' "$ip"
whois "$ip"
done
Можно использовать a sed
управляйте, чтобы извлечь весь IP IP-адреса из файла, затем использовать xargs
работать whois
для каждого соответствия:
sed 's/^.*SRC=\([0-9.]*\).*$/\1/;t;d' < /var/log/syslog | xargs -n1 whois >> output.txt
s/^.*SRC=\([0-9.]*\).*$/\1/
управляйте заменяет строки, которые содержат SRC=x.x.x.x только с IP-адресом.
't; d' команды пропускает несогласующие отрезки длинной линии (таким образом, избегающий отдельного grep
команда).
xargs
команда вызывает whois
однажды для каждого адреса это sed
выводы.
С другой стороны, можно найти и зарегистрировать согласующие отрезки длинной линии сначала, затем извлечь IP-адреса отдельно:
grep -eSRC=[0-9.]* /var/log/syslog | tee grep-output.txt | sed 's/^.*SRC=\([0-9.]*\).*$/\1/' | xargs -n1 whois >> whois-output.txt`