Je n’arrive pas à créer des tableaux dans /bin/bash de Debian ! Qu’est ce que c’est que çà … ?
Il y quelques années jamais du remplacer /bin/bash (truc dangereux ) par une ancienne version si je me rappelle bien
14:36:28 root@lv1.w1a:~ # /bin/bash --version
GNU bash, version 5.0.3(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
Licence GPLv3+ : GNU GPL version 3 ou ultérieure <http://gnu.org/licenses/gpl.html>
Ceci est un logiciel libre ; vous être libre de le modifier et de le redistribuer.
AUCUNE GARANTIE n'est fournie, dans les limites permises par la loi.
14:36:29 root@lv1.w1a:~ #
14:36:39 root@lv1.w1a:~ # uname -a
Linux w1a 4.19.0-8-amd64 #1 SMP Debian 4.19.98-1+deb10u1 (2020-04-27) x86_64 GNU/Linux
14:36:39 root@lv1.w1a:~ #
J’ai fais un script tout bête… mais j’ai du faire une boucle pour récupérer une valeur du tableau $RESOLVERS aléatoirement - shuf -i 0-1 -n1 (soit 0 soit 1 par exemple)
14:37:42 root@lv1.w1a:~ # cat /etc/debian_version
#!/usr/bin/env bash
######!/bin/ksh
# Sur debian - no create array ???
# /bin/sh -> dash
# /bin/bash ?
# Only ksh88
# Date Actuelle
DATE=`date +%Y\/%m\/%d\ %H\:%M\:%S`
# Domain list check
DOMAINLIST="zw3b.fr zw3b.net zw3b.tv zw3b.site zw3b.blog lab3w.fr lab3w.com ipv01.net ipv10.net"
RAND="`shuf -i 0-2 -n1`"
#RAND="1"
#declare -A RESOLVERS
#RESOLVERS=("dns.google" "45.90.28.0" "2620:0:ccc::2")
#declare -A RESOLVERS=([0]="dns.google" [1]="45.90.28.0")
#RESOLVERS[0]="dns.google"
#RESOLVERS[1]="45.90.28.0"
#echo ${RESOLVERS[@]};
#exit
RESOLVERS="dns.google 45.90.28.0 resolver2.ipv6-sandbox.opendns.com"
RESOLVERS="dns.googleeee 465.90.28.0 resolver10.ipv6-sandbox.opendns.com"
c=0
for r in $RESOLVERS
do
if [ $c = $RAND ]
then
RESOLVER=$r
fi
c=$(($c+1))
done
echo $RESOLVER
#exit
for d in ${DOMAINLIST}
do
echo "#------------------------------"
echo "${DATE} ${USER}@$(hostname -a) -> dig SOA ${d} @${RESOLVER} +short"
DIG=`dig SOA ${d} @${RESOLVER} +short 2>/dev/null`
if [ "${DIG}" != "" ]
then
echo ${DIG}
else
echo "ERROR : ${d}"
echo "SEND SMS/MAIL"
fi
done
echo "#------------------------------"
exit 0
14:37:42 root@lv1.w1a:~ #
Vérifie que mes zones DNS de domaines sont actives et récupére le SOA sur un résolveur DNS aléatoirement configuré et envoie un mail s’il y a une erreur.
Avec une crontab (tâche planifiée) toutes les 6 heures et quelques minutes aléatoirement - pour ne pas surcharger nos/les serveurs - dans ce monde informatisé - toutes nos tâches planifiées à la même heure.
Imaginez que j’ai, que tu as un service utilisé par 100 000 personnes qui est utilisé depuis une crontab, puis les 100 000 personnes lance la crontab à minuit 00h00 : La surcharge à minuit, c’est trop lourd. La solution est d’utilisez une variable aléatoire avant le lancement du script directement dans la crontab avec un shuf -i 0-1800 -n1 avec un lancement toutes les 2 heures - comme cela toutes les 2 heures et 30 minutes (maximum) le script s’exécutera - c’est important - ou dans le script lui-même
#!/bin/bash
##############################
# Check DNS Zones UP
##############################
# Date Actuelle
DATE=`date +%Y\/%m\/%d\ %H\:%M\:%S`
# Domain list check
DOMAINLIST="zw3bbbbb.fr zw3b.net zw3b.tv zw3b.site zw3b.blog lab3w.fr lab3w.com ipv01.net ipv10.net"
RAND="`shuf -i 0-2 -n1`"
RAND="0"
#declare -A RESOLVERS
#RESOLVERS=("dns.google" "45.90.28.0" "2620:0:ccc::2")
RESOLVERS=("dns.google")
ERR=0
PRINT="#------------------------------\n"
PRINT+="Check DNS Zones UP\n"
PRINT+="|\n"
for d in ${DOMAINLIST}
do
PRINT+="#------------------------------\n"
PRINT+="${DATE} ${USER}@$(hostname -a) -> dig SOA ${d} @${RESOLVERS[$RAND]} +short\n"
DIG=`dig SOA ${d} @${RESOLVERS[$RAND]} +short 2>/dev/null`
if [ "${DIG}" != "" ]
then
PRINT+="${DIG}\n"
else
ERR=1
PRINT+="ERROR : ${d}\n"
fi
done
PRINT+="#------------------------------"
if [ $ERR = 1 ]
then
echo -e $PRINT
#echo -e $PRINT | mail -s "[ERROR]DNS" superadmin2@domain.tld,superadmin@domain.tld
echo "| SEND SMS/MAIL"
echo "#------------------------------"
else
echo -e $PRINT
fi
exit 0
Avec la tache planifiée « crontab » toutes les 6h aléatoire des minutes
NdMoi-même : Recommendation random scheduled tasks !
# DNS CHECK ZONE (toutes les 6h aléatoire des minutes (3600/60))
0 */6 * * * sleep $(shuf -i 0-3600 -n1) ; /root/dns-check-zones-up.sh 1>>/var/log/syslog 2>/dev/null 2>&1
J’ai passé le sujet dans « Programmation »
Comment faire un saut de ligne à chacune de mes variables $PRINT hors commande echo ?
J’ai essayé cela :
#!/bin/bash
ARRAY=(one two three)
echo ${ARRAY[@]}
PRINT=""
PRINT+="one"
PRINT+="\r"
PRINT+=`echo "\n"`
PRINT+="\\n"
PRINT+="$(echo "\\n")"
PRINT+=" two $(echo "\n")"
PRINT+=" three "'\n'
echo $PRINT
Me retourne :
16:31:25 root@lv1.w1a:~ # bash test-scripting.bash
one two three
one\r\n\n\n two \n three \n