У меня есть файл, который имеет следующее:
6 192.168.0.4
13 192.168.0.2
2 192.168.0.9
Первое число является количеством раз, в которое IP справа попытался войти в мою машину (ssh) из той же сети. Цель состоит в том, чтобы заблокировать тот IP с помощью netfilter, если попытка - больше чем 3. Здесь, 2 из записей соответствуют критериям.Примечание: Могло бы быть больше чем 3 записи.
Я не могу выяснить способ отсортировать этот файл линию за линией (я ОЧЕНЬ плохо знаком с Bash). Вот то, что я попробовал:
#!/bin/bash
file="/home/foo/documents/iptxt"
while IFS='' read line || [[ -n "$line" ]]; do
char1=`awk '{ print $1 }' $file`
char2=`awk '{ print $2 }' $file`
if $char1 -gt 3
then
echo "$char2 has tried to login $char1 times
fi
done <$file
Это дает "команду, не найденную" ошибка, указывающая на 5-ю строку (если оператор). Неудивительный, потому что я повторил $char1_attempt и он дает:
6 13 2
6 13 2
6 13 2
В настоящее время J просто хочу, чтобы это распечатало строки как:
192.168.0.4 has tried to login 6 times
192.168.0.2 has tried to login 13 times
192.168.0.1 has tried to login 2 times
Помогите!
Я рекомендовал бы запуститься как это:
#!/bin/bash
file="/home/foo/documents/iptxt"
while read num addr ; do
if [[ "$num" && "$addr" ]] ; then
echo "$addr has tried to log in $num times"
fi
done < "$file"
Сюда, read
хранит первое слово каждой строки в $num
и остальная часть строки в $addr
, который должен только быть IP-адресом. Затем в цикле с условием продолжения, мы проверяем, не ли и пусты, и если это так, печатают сообщение.