shell -e: mais où est l'erreur ?!
#1

Bonjour,



Je me suis crée le script suivant pour analyser mes logs web et bannir certaines ip selon des termes recherchés :



Voici le code:

Code :
#!/bin/sh

set -e

set -x

[ -n "$TERM" ] && clear

###

#

# Author: Stéphane HUC

# mail: dev+ksh@huc.fr.eu.org

# gpg:fingerprint: CE2C CF7C AB68 0329 0D20  5F49 6135 D440 4D44 BD58

#

# License: BSD Simplified

#

# Date: 2020/09/04

#

###

#

# Analyse weblogs to put badips on tables pf

#

###



set -A bots  bot Liquor polaris puzzle Scylla Uirusu ZmEu

set -A terms adm backup cgi conf database db dump login mstshash php sql XDEBUG_SESSION_START xxx



set -A domains "doc.huc.fr.eu.org" "stephane-huc.net" "ns1.stephane-huc.net"



set -A whites "2001:470:cc33::3" "2001:470:cc33:2::47"



for bot in "${bots[@]}"; do

    pfctl -t badips -T add "$(awk "/${bot}/"' { print $1 }' /var/www/logs/access.log)"

   

    for domain in "${domains[@]}"; do

file="/var/www/logs/${domain}/access.log"

printf '%s\n' "Search for bot: $bot, in file: $file"

logger "$0: Search for bot: $bot, in file: $file"

if [ -f "${file}" ]; then


ip="$(awk "/${bot}/"' { print $1 }' "${file}")"

if [ "${ip}" != "${domain}" ]; then

#pfctl -t badips -T add "${ip}";

## si ip n'est pas dans array whites

printf '%s\n' "${whites[@]}" | grep -Fqxz "${ip}" || pfctl -t badips -T add "${ip}"

fi


fi

        unset file

    done



done
Je l'ai posé là : https://bin.disroot.org/?db6f54877ae8f14...A8LxMhrtbT

Mais, voilà… pour une raison que je ne comprends pas, il s'arrête à la première analyse, faite selon le premier domaine.

Une idée ?

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#2

tu peux poster les quelques lignes avant que ça s'arrête vu que tu as un set -x dans le script ?


si dans le cas if [ -f "${file}" ] le fichier n'existe pas, ça va quitter avec set -e il me semble
Répondre
#3

En fait, tout ce qui est susceptible de retourner un code !=0 fera quitter le script.
En cas de test, prévois une porte de sortie avec ||
Répondre
#4

@solene:

Code :
+ set -A bots bot Liquor polaris puzzle Scylla Uirusu ZmEu
+ set -A terms adm backup cgi conf database db dump login mstshash php sql XDEBUG_SESSION_START xxx
+ set -A domains doc.huc.fr.eu.org stephane-huc.net ns1.stephane-huc.net
+ set -A whites 2001:470:cc33::3 2001:470:cc33:2::47
+ awk /bot/ { print $1 } /var/www/logs/access.log
+ pfctl -t badips -T add 157.55.39.2
207.46.13.183
114.119.164.167
114.119.162.150
173.231.59.202
173.231.59.202
34.73.120.35
34.73.120.35
114.119.162.148
114.119.165.120
150.109.58.14
46.229.168.145
46.229.168.148
114.119.165.40
114.119.164.5
35.237.182.213
35.237.182.213
114.119.154.186
114.119.146.158
80.82.68.16
46.229.168.135
54.36.148.35
89.44.201.120
66.249.76.150
66.249.76.150
66.249.76.148
46.229.168.144
114.119.138.179
114.119.131.92
157.55.39.60
34.75.126.177
34.75.126.177
114.119.152.50
114.119.129.50
35.223.127.110
114.119.156.60
114.119.139.107
35.190.151.251
35.190.151.251
95.91.41.38
95.91.41.38
114.119.131.254
114.119.142.28
no IP address found for 157.55.39.2
207.46.13.183
114.119.164.167
114.119.162.150
173.231.59.202
173.231.59.202
34.73.120.35
34.73.120.35
114.119.162.148
114.119.165.120
150.109.58.14
46.229.168.145
46.229.168.148
114.119.165.40
114.119.164.5
35.237.182.213
35.237.182.213
114.119.154.186
114.119.146.158
80.82.68.16
46.229.168.135
54.36.148.35
89.44.201.120
66.249.76.150
66.249.76.150
66.249.76.148
46.229.168.144
114.119.138.179
114.119.131.92
157.55.39.60
34.75.126.177
34.75.126.177
114.119.152.50
114.119.129.50
35.223.127.110
114.119.156.60
114.119.139.107
35.190.151.251
35.190.151.251
95.91.41.38
95.91.41.38
114.119.131.254
114.119.142.28
En revoyant le retour, je viens de réaliser qu'il ne rentre même pas dans la deuxième boucle for.

Quant au chemin des fichiers, je peux te garantir qu'ils sont bons. Mais te connaissant, tant que tu ne l'auras pas vu :
Code :
$ ls -al /var/www/logs/doc.huc.fr.eu.org/access.log                                                                  
-rw-r--r--  1 www  daemon  2102220 Sep  4 11:34 /var/www/logs/doc.huc.fr.eu.org/access.log
$ ls -al /var/www/logs/stephane-huc.net/access.log  
-rw-r--r--  1 www  daemon  133435 Sep  4 11:34 /var/www/logs/stephane-huc.net/access.log
$ ls -al /var/www/logs/ns1.stephane-huc.net/access.log
-rw-r--r--  1 www  daemon  2101 Sep  3 12:55 /var/www/logs/ns1.stephane-huc.net/access.log

@prx: ok, pour la précision concernant le code de retour. par contre, le reste, je n'ai rien compris ! ???

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#5

J'ai résolu ainsi :

Code :
for bot in "${bots[@]}"; do
    printf '%s\n' "Search for bot: $bot"
    set -A ips -- $(awk "/${bot}/"' { print $1 }' /var/www/logs/access.log)
    for ip in "${ips[@]}"; do
        printf '%s\n' "${whites[@]}" | grep -Fqx "${ip}" || pfctl -t badips -T add "${ip}"
    done
    
    for domain in "${domains[@]}"; do
        file="/var/www/logs/${domain}/access.log"
        printf '%s\n' "Search for bot: $bot, in file: $file"
        if [ -f "${file}" ]; then
            set -A ips -- $(awk "/${bot}/"' { print $1 }' "${file}")
            for ip in "${ips[@]}"; do
                if [ "${ip}" != "${domain}" ]; then
                ## si ip n'est pas dans array whites
                    printf '%s\n' "${whites[@]}" | grep -Fqx "${ip}" || pfctl -t badips -T add "${ip}"
                fi
            done
            # printf '%s\0' "${a[@]}" | grep -Fqxz c ## --fixed-strings --quiet --line-regexp --null-data
        fi
        unset file
    done

done

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#6

Hors sujet mais
(04-09-2020, 23:51:13)PengouinBSD a écrit :  
Code :
printf '%s\n' "${whites[@]}" | grep -Fqx "${ip}" || pfctl -t badips -T add "${ip}"
Même si "whites" ne contient pas beaucoup d'éléments,
en faire une table permettrait de simplifier en :
Code :
pfctl -t whites -T test "${ip}" || pfctl -t badips -T add "${ip}"
Répondre
#7

@eol: suggestion intéressante. merci.
on est d'accord, la table white est autorisée en entrée/sortie dans pf.

----

J'ai ajouté en fin de script cela :
Code :
count="$(pfctl -t badips -T show | wc -l)"
logger "$0: write PF's table badips into /etc/pf-badips.txt (${count} entries)"
unset count

pfctl -t badips -T show > /etc/pf-badips.txt

et dans le fichier de conf de pf :
Code :
table <badips> counters persist file "/etc/pf-badips.txt"

Et, me suis même créer un /etc/rc.shutdown dans lequel je lui demande de "sauvegarde"r la table vers le fichier text, en question.

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)