#bash #sorting #logging #scripting
#bash #сортировка #ведение журнала #сценарии
Вопрос:
Я пытаюсь отсортировать журнал, чтобы показать первые 3 уникальных IP-адреса для атаки на сервер. Я просматриваю журнал, чтобы найти неудачные попытки ввода пароля. Затем я сортирую этот результат по дате. Затем я передаю этот вывод в другую сортировку на основе 11-го столбца, чтобы получить только первое появление атаки для каждого уникального IP-адреса. Я передаю выходные данные в функцию head, чтобы получить первые 3 строки, а затем распечатать их с помощью awk. Команда, которую я использовал: grep 'Failed password' auth.log | sort -k1M -nk2 -nk3 | sort -k11,11 -u | head -3 | awk '{print $1" "$2" "$3" "$11}'
Правильные IP-адреса извлекаются из этого кода, но они не в порядке в зависимости от времени, как показано ниже:
Я попытался использовать -nk3.1,3.2 -nk3.4,3.5 -nk3.7,3.8
для time вместо -nk3, но я получаю тот же результат. Есть идеи, как исправить эту проблему?
Вот фрагмент файла журнала для вашей справки:
Oct 11 10:12:24 myraptor sshd[29463]: Connection from 169.139.243.218 port 57273
Oct 11 10:12:25 myraptor sshd[29465]: Failed password for harvey from 169.139.243.218 port 57273 ssh2
Oct 11 10:12:25 myraptor sshd[29467]: Received disconnect from 169.139.243.218: Bye Bye
Oct 11 10:12:27 myraptor sshd[29469]: Connection from 169.139.243.218 port 57274
Oct 11 10:12:28 myraptor sshd[29471]: Failed password for harvey from 169.139.243.218 port 57274 ssh2
Oct 11 10:12:28 myraptor sshd[29473]: Failed password for harvey from 169.139.243.218 port 57274 ssh2
Oct 11 10:12:28 myraptor sshd[29475]: Received disconnect from 169.139.243.218: 11: Bye Bye
Oct 11 10:13:03 myraptor sshd[29477]: Connection from 56.13.188.38 port 55319
Oct 11 10:13:04 myraptor sshd[29479]: Failed password for harvey from 56.13.188.38 port 55319 ssh2
Oct 11 10:13:04 myraptor sshd[29481]: Received disconnect from 56.13.188.38: Bye Bye
Oct 11 10:13:15 myraptor sshd[29483]: Connection from 30.167.206.91 port 55320
Oct 11 10:13:16 myraptor sshd[29485]: Failed password for harvey from 30.167.206.91 port 55320 ssh2
Oct 11 10:13:16 myraptor sshd[29487]: Received disconnect from 30.167.206.91: Bye Bye
Oct 11 10:13:18 myraptor sshd[29489]: Connection from 30.167.206.91 port 55321
Oct 11 10:13:18 myraptor sshd[29491]: Failed password for harvey from 30.167.206.91 port 55321 ssh2
Oct 11 10:13:18 myraptor sshd[29493]: Received disconnect from 30.167.206.91: Bye Bye
Ожидаемый результат:
Oct 11 10:12:25 169.139.243.218
Oct 11 10:13:04 56.13.188.38
Oct 11 10:13:16 30.167.206.91
Комментарии:
1. Пожалуйста, разместите проверяемую дату выборки в тексте, не публикуйте ее в комментариях, а отредактируйте свой первоначальный вопрос и соответствующий ожидаемый результат.
2. Можете ли вы поделиться фрагментом файла журнала в виде текста?
3. Я предоставил запрошенную информацию. Спасибо за вашу помощь!
Ответ №1:
Не могли бы вы попробовать следующее:
grep 'Failed password' auth.log | sort -k1M -nk2 -nk3 | awk '!seen[$11] {print $1, $2, $3, $11}' | head -n3
Вывод:
Oct 11 10:12:25 169.139.243.218
Oct 11 10:13:04 56.13.188.38
Oct 11 10:13:16 30.167.206.91
awk
Условие !seen[$11]
делает уникальным внешний вид 11-го поля без изменения временного порядка.
Комментарии:
1. Спасибо за оперативную обратную связь! Приятно знать, что это работает.
Ответ №2:
В awk:
$ awk ' # all awk
$6=="Failed" { # when Failed met
if(!($11 in ips)) { # and the ip has not been seen before
ipc[ i]=$11 # increase stored ip counter
ips[$11] # and store ip for checking
if(i==3) # once we have 3 ips
exit # we exit ie. execute END
}
}
END {
for(j=1;j<=i;j ) # iterate index for ipc
print ipc[j] # and output
}' file
Вывод:
169.139.243.218
56.13.188.38
30.167.206.91
Бесполезно grep
, если вы все равно используете awk. И если вы используете GNU awk, в большинстве случаев вы тоже можете пропустить sort
.
Ответ №3:
Вы можете использовать awk
для подсчета IP-адреса построчно
grep 'Failed password' auth.log | sort -k1M -nk2 -nk3 | sort -k11,11 | awk '!d[$11] ' | head -3 | awk '{print $1" "$2" "$3" "$11}'
Комментарии:
1. Я думал об этом, но меня беспокоит то, что если у меня нет правильного порядка, прежде чем я сделаю head -3, я могу получить неправильные IP-адреса.
2. Отредактировано. Теперь
awk
вместо-u
используется для удаления дубликатов, которые не изменят порядок.