J'utilise le site shellcheck pour vérifier que je n'ai pas fait d'erreur de syntaxe, déclaré des variables inutilisées, etc.
shellcheck peut fonctionner localement si vous ne souhaitez que vos scripts restent sur votre machine (disponible dans les dépôts de votre distribution) :
$ shellcheck myscript
In myscript line 12:
eof
^-- SC1118: Delete whitespace after the here-doc end token.
Je l'utilise avant de vous partager un script sur Blogmotion et cela me permet de faire une vérification avant publication. Il y a toujours quelques détails à modifier
Je vous partage aussi la présentation d'Adrien D :
Attention aux suggestions de correction sur les doubles quotes, qui peuvent parfois être superflues et casser le script (j'ai eu le cas avec cURL).
Pour faire tourner du code en ligne (bash y compris) je vous rappelle que vous pouvez utiliser le site ideone.
Les organisations publiques telles que les régies des eaux ne sont pas forcément les mieux dotées en terme de délivrance d'email.
Il est très facile de passer à côté d'une notification de facture à payer, ou pire : de ne jamais recevoir la facture ! Ensuite c'est la relance par courrier et éventuellement les pénalités qui vont avec
Pour éviter ça j'ai écrit un script bash qui va vérifier tous les jours si une facture est en attente de règlement et me notifie sur mon téléphone via ntfy :
Cela fonctionne avec certaines communes de l'agglomération Grenobloise, mais pas que.
Liste des communes de l'agglo compatibles
Avant tout vous devez savoir si votre commune est compatible avec ce script. Pour que cela fonctionne votre commune doit être en "gestion métropole".
3 méthodes pour cela : une facile 2 autres plus destinées aux bidouilleurs. Pas d'inquiétude car peu importe la méthode le résultat sera le même.
Méthode 1 (facile)
Rendez-vous sur cette page https://ael.eauxdegrenoblealpes.fr/ puis cliquer sur votre commune dans le menu.
Prêtez attention au message qui vous informe de qui dépend votre commune :
Si votre commune dépend de "Métropole Alpes Grenoble" le script fonctionnera pour votre commune.
Si votre commune dépend d'autre chose que "Métropole Alpes Grenoble" désolé mais ce script ne fonctionnera pas.
Cette valeur correspond aux communes qui utilisent le système d'agence en ligne (AEL) de "www.somei.fr" (également visible dans les entêtes HTTP de certaines requêtes) compatible avec ce script. Si votre commune fait partie de la liste retournée alors ce script fonctionnera.
Si vous habitez en dehors de l'agglomération Grenobloise et que cela marche pour vous pensez à le préciser en commentaire
Vous n'avez maintenant plus aucune excuse pour payer vos factures en retard !
Vous pouvez ensuite connecter le tout facilement à votre solution domotique, ou laisser le script tourner en crontab.
Je suis content de vous partager ce bout de script car j'ai passé quelques heures dessus pour décortiquer le fonctionnement sans avoir d'API digne de ce nom. Je ne m'attendais pas à devoir faire autant d'étapes avec cURL !
J'espère que ce script vous sera utile! En tout cas c'était un très entrainement pour moi et je sais que cette base me resservira. D'ailleurs je vous partage très bientôt un autre script similaire pour des charges envoyés par un syndic d'immeuble (même problème : les emails arrivent aléatoirement...)
Dans ce tutoriel, nous allons voir comment créer un fichier d'une taille définie sur une machine Linux (Debian, Ubuntu, Rocky Linux, Fedora, etc.) grâce à l'utilisation de la commande "dd" et d'un fichier spécial : /dev/zero.
Que ce soit sous Linux, Windows, ou un autre système, il est intéressant de savoir créer des fichiers vide ayant une taille définie. Pourquoi ? Nous pouvons imaginer plusieurs scénarios et cas d'usages. Par exemple, pour effectuer un transfert de fichiers plus ou moins lourd et voir le taux de transfert sur le réseau, pour tester une restriction au niveau des quotas sur une machine, ou encore pour tester des commandes de recherche fichiers en fonction de leur taille.
Pour atteindre notre objectif, nous allons utiliser la commande « dd » qui est une sorte de couteau suisse permettant de nombreuses opérations dont la création de fichiers avec une taille prédéfinie. Nous allons coupler l'utilisation de la commande "dd" avec le fichier de périphérique "/dev/zero" qui a une particularité : lorsqu'on le lit, il génère des caractères nuls (des zéros). Ainsi, nous allons pouvoir générer plus ou moins de zéros en fonction de la taille de fichier souhaitée.
Voyons comment créer un fichier de 100 Mo, nommé « MonFichier.txt » (stocké dans le répertoire courant) et qui sera constitué de 100 000 blocs de 1 Ko. La seconde commande permet de lister le contenu du répertoire en affichant la taille sous une forme lisible.
Le paramètre « bs » correspond à « block_size » c’est-à-dire la taille d’un bloc et, « count » au nombre de blocs de cette taille qu’on doit créer. En ce qui concerne « if=/dev/zero », on appelle comme fichier d’entrée un fichier spécial qui génère des caractères nuls. De ce fait, le fichier sera rempli de 0.
Partant de ce constant, nous pouvons jouer sur les paramètres "bs" et "count" pour atteindre le même résultat en créant un fichier avec un seul bloc de 100 Mo. Ce qui donnerait :
Vous l'aurez compris : vous pouvez jouer sur ces deux valeurs pour obtenir le résultat de votre choix. Ainsi, nous pouvons facilement créer des fichiers de plusieurs Mo ou Go.
Si vous cherchez à mesurer les performances d'un disque, vous pouvez utiliser la commande "dd" d'une autre façon qui consiste à ajouter le flag "oflag=direct". Voici comment effectuer un test avec 10 blocs de 1 Go :
À la fin, vous allez obtenir le résultat (débit) directement dans la console :
Sachez que vous pouvez remplacer « /dev/zero » par "/dev/random" ou "/dev/urandom" pour remplir un fichier avec des nombres aléatoires, plutôt que d'utiliser des valeurs nulles.
III. Conclusion
La commande "dd" fait partie des indispensables sous Linux, notamment parce qu'elle est utile dans différents scénarios ! Nous pourrions également l'utiliser pour effectuer un effacement sécurisé d'un disque, mais ceci pourra faire l'objet d'un autre article.
Dans ce tutoriel, nous allons apprendre à calculer la taille d'un dossier sous Linux, à l'aide de la commande "du". Que ce soit sous Linux, ou sur un autre système d'exploitation, il peut s'avérer nécessaire et utile d'être capable d'afficher la taille totale d'un dossier ou d'un fichier.
Sous Linux, la commande "du" qui signifie "Disk Usage", fait partie des commandes indispensables, notamment sur un système dépourvu d'interface graphique.
Version originale de l'article : 6 mars 2013.
II. Calculer la taille d'un dossier avec du
Pour cette démonstration, nous allons utiliser le répertoire "/home/flo/docs" qui contient plusieurs fichiers, comme le montre l'image ci-dessous :
ls -l /home/flo/docs
Tout d'abord, il faut savoir que le fait d'exécuter la commande "du" sans option va permettre d'obtenir la taille du répertoire courant.
du
Dans le cas présent, la valeur retournée est celle-ci : 350004. Voilà, ceci correspond à la taille, en octets, de ce répertoire.
Pour que ce soit plus facile à lire, nous allons ajouter l'option "-h" qui signifie "Human readable" et qui permet d'afficher le résultat en kilo-octets, méga-octets, giga-octets, etc... Afin d'avoir une valeur plus facilement compréhensible pour un humain.
du -h
Cette fois-ci, le résultat est plus explicité : 342M, pour 342 Mo.
Voici la différence en image :
Ici, il n'y a pas de sous-dossiers dans "/home/flo/docs", donc la commande retourne uniquement la taille de ce répertoire. Il est à noter que s'il y a des sous-dossiers, la commande du va retourner la taille totale, ainsi que la taille pour chaque sous-dossier. Pratique, n'est-ce pas...
Voici un exemple, si l'on remonte d'un cran (/home/flo) :
Si l'on souhaite obtenir un résultat plus compact avec uniquement la taille totale, l'option "s" doit être ajoutée, comme ceci :
du -sh
Enfin, sachez que pour calculer la taille du répertoire de notre choix, il suffit de le préciser à la suite de la commande. Par exemple, si l'on désire calculer la taille du répertoire "/etc/" de notre machine :
du -sh /etc/
Peu importe dans quel répertoire on se situe (au niveau du prompt), c'est bien la taille du répertoire cible qui est calculée.
Remarque : si vous spécifiez le chemin vers un fichier, vous pouvez obtenir sa taille dans un format human readable avec l'option "h". Toutefois, cette option est également disponible avec la commande "ls" que vous connaissez certainement.
III. Obtenir la liste des répertoires les plus volumineux
La commande du, couplée aux commandes sort et head, va permettre d'obtenir la liste des répertoires les plus volumineux présents sur votre machine Linux. Dans certaines situations, notamment si l'on a besoin de libérer de l'espace disque sur un serveur Linux, ceci peut s'avérer très pratique. Ce qui est intéressant, c'est que l'on peut effectuer cette recherche sur une partie spécifique du système de fichiers : /var, /home, /etc, etc.
Sur une machine où il y a de nombreux utilisateurs, nous pourrions rechercher les répertoires "home" les plus volumineux.
Pour cela, nous allons cibler "/home" avec du puis envoyer le résultat à la commande sort pour trier les répertoires en fonction de leur taille, et enfin, nous allons envoyer la sortie de la commande sort à la commande head pour afficher que les 5 premiers répertoires (il suffit de modifier cette valeur pour avoir un Top 3, un Top 5, un Top 10, etc.).
Ce qui donne :
du -h --max-depth=1 /home/ | sort -rh | head -5
L'option "--max-depth=1" permet de prendre uniquement les répertoires de premier niveau (c'est-à-dire les répertoires avec le nom des utilisateurs, dans notre cas). C'est important, car sinon la sortie de la commande sera moins explicite.
Voici la différence avec ou sans cette option :
IV. Conclusion
La commande du, disponible sur Debian, Ubuntu, Red Hat, etc... est très pratique, et elle doit être connue de tous les administrateurs systèmes qui ont besoin de gérer des machines Linux.
Enfin, pensez à précéder la commande "du" avec "sudo" pour éviter d'utiliser directement le compte "root" et avoir suffisamment de privilèges pour calculer la taille d'un répertoire ou d'une arborescence complète.
Dans ce tutoriel, nous allons utiliser la commande "grep" sous Linux pour rechercher la présence d'un mot dans plusieurs fichiers et dossiers, sur une machine Linux (Debian 12, pour cet exemple).
La commande "grep" fait partie des commandes indispensables lorsqu'il est question d'administration de machines Linux. D'ailleurs, vous avez peut-être déjà utilisé la commande grep pour rechercher une chaine de caractère dans un fichier. Cette fois-ci, nous irons plus loin puisque nous allons effectuer une recherche dans plusieurs fichiers ou dossiers.
Les cas d'utilisation sont nombreux :
Rechercher les occurrences d'une adresse IP dans des fichiers
Rechercher les occurrences d'un nom d'utilisateur
Rechercher les occurrences d'une fonction dans un ensemble de scripts
Etc...
Sur un environnement Windows, vous pouvez utiliser le cmdlet PowerShell "Select-String" pour effectuer des recherches similaires :
Pour que la commande grep recherche dans les fichiers et dossiers de façon récursive, nous devons utiliser l'option "-r". La syntaxe de la commande sera la suivante :
grep -r "mot à rechercher" /chemin/vers/le/dossier
Par exemple, si nous voulons rechercher tous les fichiers contenants le mot "it-connect" sur tout le système (la racine "/" est notre point de départ), nous allons utiliser cette commande :
grep -r "it-connect" ./
Nous pouvons également rechercher à partir d'un autre répertoire. Par exemple, si l'on souhaite rechercher dans tous les fichiers et dossiers sous "/home", nous utiliserons cette commande :
grep -r "it-connect" /home/
Voici le résultat obtenu :
Cela signifie qu'après avoir analysé le contenu de tous les fichiers présents dans "/home/" et dans tous les sous-dossiers présents sous cette racine, grep a trouvé uniquement un seul résultat. Il s'agit du fichier "/home/flo/document.txt" et grep a identifié la chaine "www.it-connect.fr" à l'intérieur.
III. Quelques options supplémentaires
A. Grep : ne pas tenir compte de la casse
Pour étendre légèrement votre recherche, vous pouvez utiliser l'option "-i" au lancement de votre commande pour rendre grep insensible à la casse. Sinon, sans cette option, la commande est sensible à la casse, ce qui signifie qu'elle fait la distinction entre les minuscules et les majuscules, ce qui peut influencer le résultat de la recherche (c'est un mode plus strict).
Nous pouvons voir que la commande retourne un résultat supplémentaire, dans une page HTML où grep a pu identifier la chaine "IT-Connect".
B. Grep : afficher seulement les noms de fichiers
Vous pouvez simplifier le résultat de votre recherche en y ajoutant l'option "-l". Ainsi, seuls les noms des fichiers apparaitront. Sans cette option, et comme nous l'avons vu précédemment, vous aurez le nom du fichier ainsi que le contenu de la ligne contenant le mot recherché, ce qui peut rendre le résultat de la recherche peu lisible s'il y a beaucoup de résultats.
Nous pouvons afficher le numéro de ligne où une chaîne a été trouvée en utilisant l'option "-n" avec la commande grep. Cette option ne peut pas être utilisée conjointement avec l'option "-l".
Ainsi, nous pouvons que pour le premier résultat, la chaine a été identifiée sur la ligne n°1, tandis que pour le second résultat, la chaine a été identifié sur la ligne n°3.
Une fois de plus, nous pouvons constater que grep contient beaucoup d'options d'exécution, ce qui en fait un outil très puissant !
IV. Conclusion
Grâce à cette commande facile à utiliser, nous pouvons effectuer une recherche rapidement sur un système Linux. Ceci peut permettre de gagner un temps précieux...!
Je vous propose aujourd'hui une astuce à destination des possesseurs de NAS Synology qui souhaite envoyer des notifications par email. Le tout en bash.
Le but est d'envoyer un email sans se préoccuper de la configuration du serveur SMTP. Je me sers de ce système pour recevoir un compte rendu mensuel par email d'un script de sauvegarde (de Blogmotion).
Pré-requis
Il est nécessaire d'avoir configuré la partie notification dans DSM :
Panneau de configuration > système > notification
Je vous conseille de créer une boite email chez Microsoft et de la dédier pour les notifications. Cela peut fonctionner avec d'autres fournisseurs comme Gmail ou votre serveur personnalisé, libre à vous d'essayer. J'ai de bons résultats avec une boite outlook donc je n'ai pas cherché plus loin
Voici ma configuration pour une boite email Outlook :
Serveur SMTP personnalisé
Serveur SMTP : smtp.office365.com
Port SMTP : 587
A l'aide du bouton "envoyer un courriel test" vérifiez que vous recevez bien l'email. En cas de doute sur un filtrage antispam, testez sur une adresse YopMail (aucun email n'est filtré chez YopMail).
Le script bash
DSM va s'appuyer sur un fichier de configuration suivant :
/usr/syno/etc/synosmtp.conf
Voici comment parser ce fichier et envoyer un email en s'appuyant sur cette configuration :
#!/bin/bash
TOMAIL="[email protected]"
SUJETMAIL="voici le sujet du mail"CORPSMAIL="un exemple de contenu du mail"FROMMAIL=$(grep 'smtp_from_mail' /usr/syno/etc/synosmtp.conf | cut -d '=' -f2 | tr -d '"')
{
echo To: $TOMAIL
echo From: $FROMMAIL
echo Subject: $SUJETMAIL
echo
echo $CORPSMAIL
} | ssmtp $TOMAIL -v
L'option -v permet d'avoir un retour verbeux, pratique en cas de problème d'expédition.
Attention à bien laisser la ligne avec le "echo" vide.
A la place de la ligne echo $CORPSMAIL vous pouvez insérer une commande système (résultat d'un script, contenu d'un fichier, etc).
Conclusion
J'ai souhaité vous partager cette astuce qui permet d'envoyer facilement des emails, sans se soucier des problématiques de délivrabilité.
Outlook (ex Hotmail) a pour réputation d'être particulièrement tatillons pour la réception des emails vers des boites outlook, hotmail, etc. C'est pourquoi j'ai choisi d'utiliser une boite email Microsoft : les serveurs de réception du destinataire ont tendance à accorder une bonne confiance aux emails qui sont relayés par Microsoft (je ne sais pas si cette phrase est claire ). Si vous avez des données sensible privilégier un fournisseur d'email un peu plus respectueux des données (protonmail, etc).
Pensez à laisser un commentaire si ce post vous a été utile