J'ai un fichier qui a les éléments suivants:
6 192.168.0.4
13 192.168.0.2
2 192.168.0.9
Le premier nombre est le nombre de fois où l'IP de droite a essayé de se connecter à ma machine (ssh) à partir du même réseau. L'objectif est de bloquer cette adresse IP à l'aide de netfilter si la tentative est supérieure à 3. Ici, 2 entrées correspondent aux critères. Remarque: Il peut y avoir plus de 3 entrées.
Je n'arrive pas à trouver un moyen de trier ce fichier ligne par ligne (je suis très novice chez BASH). Voici ce que j'ai essayé:
#!/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
Cela donne une erreur "commande introuvable" pointant vers la 5ème ligne (si déclaration). Pas étonnant, car j'ai répété $ char1_attempt et cela donne:
6 13 2
6 13 2
6 13 2
Pour le moment, je veux juste qu'il imprime des lignes comme:
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
S'il vous plaît aider!
Je recommanderais de commencer comme ça:
#!/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"
De cette façon, read
stocke le premier mot de chaque ligne dans $num
et le reste de la ligne dans $addr
, qui ne doit être que l'adresse IP. Ensuite, dans la boucle while, nous vérifions si les deux ne sont pas vides et, dans ce cas, imprimons le message.