Tag Archives: linux

La commande ps dans la pratique

Vous aimez beaucoup votre Raspberry, mais voilà, il y a un process gourmand qui consomme toute la CPU.
Pour faire la chasse, ou tout simplement pour savoir ce qui se passe sur votre machine, il y a une commande pratique : la commande ps.
Cette commande est exécutée très souvent, mais très peu de personne l’utilise pleinement. Je vous propose donc, comme avec la commande awk, de partager avec vous mes petits tips.

Trouver les process consommant le plus de mémoire

Trouver les process consommant le plus de cpu

Le détail de ces 2 commandes

J’utilise donc la commande ps avec un certain nombre de paramètres que je vais détailler ci dessous.
ps Liste des processus courants

-e Selectionner l’ensemble des process

  o Spécifier un format utilisateur dont la configuration est :
pmem,pcpu,pid,args le format sera donc définit par mémoire,cpu, numéro de pid et commande

A cela, je rajoute un peu de tri avec les commandes tail et sort :

tail -n +2  : sortie standard à partir de la seconde ligne (pour éviter la sortie des entêtes de colonnes comme %MEM, etc …),
sort -rnk 1 : classé par ordre numérique (n), décroissant (r), et cela, suivant la première colonne (mémoire),
sort -rnk 2 : puis, classé par ordre numérique (n), décroissant (r), et suivant la seconde colonne (cpu),
head : sortie des 10 premières lignes uniquement.

Voilà, j’espère que ces quelques explications vous serviront. Bien entendu, essayer de les adapter au mieux à vos besoins.

Un history utile

Certain utilise souvent la commande history, que ce soit sur UNIX ou Linux, pour se souvenir de ce qu’on a fait, ou pour savoir ce que les autres ont fait, surtout quand on partage un compte applicatif. Le problème est qu’on retrouve bien la commande, mais jamais la date et l’heure à laquelle celle-ci a été exécutée.
Je vous propose une petite astuce bien pratique pour répondre à ce besoin, un history utile.

Il faut tout d’abord définir une variable HISTTIMEFORMAT, et la positionner dans votre fichier .profile afin qu’elle soit chargée systématiquement.

Pour bien comprendre ce qu’on demande :

Vous pouvez vous amuser comme vous voulez maintenant que vous avez tout compris.

Pour vérifier que cela fonctionne bien, déconnectez / reconnectez vous, puis tapez la commande history. Vous obtiendrez ceci :

Plus pratique, n’est-ce-pas ?

Bloquer des adresses IP par pays avec IPTABLES

Si vous exposer une de vos machines sur Internet, il faudra la protéger. Si vous ne disposez pas d’infrastructure tel que Online ou OVH chez vous, il faudra utiliser toutes les ruses possibles. Vous aurez le choix d’une solution complète, fiable, simple, comme PFsense, ou alors un Linux de base, et donc de préférence, une Debian / Ubuntu, et bloquer des adresses IP par pays avec iptables… 🙂

Ras le bol de la pollution

Si vous jeter un œil parfois sur les journaux de votre firewall, vous avez du vous apercevoir que ceux-ci sont remplis de tentatives d’intrusions. Pour se débarrasser d’une grande partie de cette pollution, parfois, il suffit simplement de bloquer des adresses IP par pays avec iptables. En effet, les attaques proviennent généralement toujours des mêmes pays (Chine, Russie, Corée, Hong-Kong, etc…).
Pour ce faire, vous pouvez simplement utiliser un module de noyau pour iptables, appelé « xtables-addons ».

Installer le module xtables-addons

Sur Debian / Ubuntu, il est assez facile (comme assez souvent) d’installer ce module grâce à la commande apt-get.

Mettre à jour la base Maxmind

Ensuite, il faudra télécharger la base de données géographique Maxmind. Pour cela, il faudra connaitre l’emplacement de l’outil xt_geoip_dl. En effet, cela dépendra de la version de xtables-addons installée (actuellement, dans les dépôts Debian, la version 2.6 est packagée, alors que la version 2.10 est disponible sur Sourceforge https://sourceforge.net/projects/xtables-addons/files/).

Cela téléchargera donc la base Maxmind :

Il vous reste maintenant à construire les listes avec la commande suivante dans le même répertoire (il faut au préalable créer le répertoire qui les contiendra) :

Bloquer des adresses IP par pays avec iptables

Côté pratique, rien de plus simple, vous pourrez bloquer les IP venant de Chine, de Hong-Kong, de Corée, de Russie ou d’ailleurs :

Ou alors, tout simplement n’autoriser que les adresses IP de votre pays (dans notre cas, sur le port 22) :

Maintenant, il ne vous reste qu’à automatiser la mise à jour de la base de données Maxmind. Dans mon exemple, nous allons créer le script /etc/cront.monthly/0update_maxmind , afin que celui-ci soit exécuté une fois par mois :

N’oublier pas de le rendre exécutable :

Vous voilà prêt à jouer et à bloquer des adresses IP par pays avec iptables.

Références :
http://xtables-addons.sourceforge.net/geoip.php
https://room362.com/post/2016/blocking-countries-via-iptables/
https://www.internetstaff.com/frustrate-ssh-scanners-geoip-iptables-blocking/
https://www.linode.com/stackscripts/view/3807-jeffkyjin-ipp2p+filtering

GREP – Globally search for Regular Expression and Print it

Qui, travaillant sous Unix ou Linux, n’a jamais utilisé la commande grep? La réponse est simple il me semble: personne!!!
Pour faire simple, grep est une petite famille de 3 commandes qui permet de rechercher une chaine dans des fichiers, et d’en imprimer les lignes.
Elle n’a l’air de rien comme cela, mais c’est une commande terriblement efficace, l’une des commandes les plus utiles dans tout système Unix, avec sed et awk.

Présentation

g/RE/p signifie globally search for RE and print it où RE est un raccourci pour RegularExpression.
Pour faire ultra simple, grep est un outil qui permet de chercher une expression régulière (motif ou pattern en anglais) dans un contenu, et d’en afficher le résultat.

Expression régulière ?

Les expressions régulières, ou plus communément appelées RegEx, constituent un système puissant et rapide afin de rechercher dans des chaînes de caractères un motif (une occurrence, une autre chaine de caractères définie). On utilise les expressions régulières dans presque toutes les commandes d’administration. On peut les retrouver dans de nombreux langages comme le BASH, le PHP, Javascript, etc… ou encore dans des logiciels d’édition, comme vi, Notepad++, PsPad, etc… .
C’est pour quoi, je ne développerai pas plus sur les RegEx ici, car des livres complets existent sur ce sujet, et un article entier serait une bonne façon des aborder, plutôt que quelques lignes posées dans un paragraphe.

Fonctionnement

Ces trois commandes grep fonctionnent de la même façon.
Grep commence à lire la première ligne du fichier (ou depuis l’entrée standard si aucun fichier n’est fourni, ou si le nom – est mentionné) , la copie dans un tampon, la compare à la chaîne de recherche (le motif), et si la comparaison est valide, imprime la ligne à l’écran. Grep va ainsi répéter ce processus jusqu’à la fin du fichier (ou de l’entrée standard).

Les symboles

On va d’abord vite faire le tour des symboles que nous pouvons utiliser dans les expressions régulières.
Les caractères ^ et $ indiquent le début ou la fin d’une chaîne, et permettent donc de la délimiter.
« ^debut »: chaîne qui commence par « debut »
« fin$ »: chaîne qui se termine par « fin »

Les caractères *, + et ?, respectivement zero ou plusieurs, un ou plusieurs, un ou aucun, permettent de donner une notion de nombre.
« abc+ »: chaîne qui contient « ab » suivie de un ou plusieurs « c » (« abc », « abcc » …)
« abc* »: chaîne qui contient « ab » suivie de zero ou plusieurs « c » (« ab », « abc » …)
« abc? »: chaîne qui contient « ab » suivie de zero ou un « c » (« ab » ou « abc »)

Les accolades {,} permettent de donner des limites de nombre.
« abc{2} »: chaîne qui contient « ab » suivie de deux « c » (« abcc »)
« abc{2,} »: chaîne qui contient « ab » suivie de deux « c » ou plus (« abcc » etc..)
« abc{2,4} »: chaîne qui contient « ab » suivie 2, 3 ou 4 « c » (« abcc » .. « abcccc »)

Les parenthèses ( ) permettent de représenter une séquence de caractères.
« a(bc)* »: chaîne qui contient « a » suivie de zero « bc » ou plus

Le pipe (la barre verticale) | se comporte en tant qu’opérateur OU
« un|le »: chaîne qui contient « un » ou « le »
« (un|le) chat »: chaîne qui contient « un chat » ou « le chat »
« (a|b)* »: chaîne qui contient une suite de « a » ou de « b »

Le point . indique n‘importe quel caractère
« ^.{3}$ »: chaîne qui contient 3 caractères

Les crochets [-] définissent une liste de caractères autorisés (ou interdits).
Le signe permet quand à lui de définir un intervalle. Le caractère ^ après le premier crochet indique quand à lui une interdiction.
« [abc] »: chaîne qui contient un « a », un « b », ou un « c »
« [a-z] »: chaîne qui contient un caractère compris entre « a » et « z »
« ^[a-zA-Z] »: chaîne qui commence par une lettre
« ^[^a-zA-Z] »: chaîne qui ne commence pas par une lettre

Des exemples

Oui, parce que c’est bien beau tout cela, mais il faut aussi pratiquer. Vous imaginez qu’on ne va pas non plus faire le tour de la question, mais uniquement faire tomber les premières barrières qui pourraient vous empêcher d’utiliser grep.

Pour des exemples simples, je ne vais pas faire de copier/coller, vous en trouverez ici, et ci-dessous, certains exemple que j’utilise au bureau.

Test les Erreurs dans un fichier de log : il ne faut avoir ni des ORA- ni des PLS- :

Vérifier si une chaine de caractères est présente dans un fichier :

Fonction privée pour valider une adresse email :

Fonction de test si une chaîne de caractères est numérique :

La Famille

Je disais une petite famille, car grep est disponible en trois commandes distinctes mais toutes liées : grep, egrep et fgrep.
Egrep est identique à grep -E.
Fgrep est identique à grep -F.
Rgrep est identique à grep -r.

-E, –extended-regexp
Interpréter le MOTIF comme une expression rationnelle étendue
-F, –fixed-strings
Interpréter le MOTIF comme une liste de chaînes de caractères, séparées par des sauts de ligne. Chacune d’entre elles doit être recherchée.
-r, –recursive
Lire tous les fichiers à l’intérieur de chaque répertoire, récursivement.

 Maintenant, amusez-vous bien, mais je serais curieux de voir cela. Alors n’hésitez pas à publier vos trouvailles.

Crontab pour les nuls

Cron est ce qu’on appelle un planificateur de tâches périodiques pour les systèmes de type Unix. Il permet aux utilisateurs de planifier des tâches pour une exécution périodique. Il est couramment utilisé pour automatiser les tâches de maintenance du système ou d’administration. Je vais faire un rapide tour pour que vous puissiez au moins avancer un peu.
Prenons comme exemple un petit script de sauvegarde qu’on appellera sync_home.sh Ensuite, il y a 2 solutions. Soit l’exécution est rattachée à un utilisateur, soit elle est rattachée au système. Dans le premier cas de figure, il faut se connecter avec cet utilisateur, et exécuter la commande crontab -e . Si ça n’est pas déjà fait, vous allez pouvoir choisir l’éditeur de votre choix.

Dans le second cas, il faudra éditer le fichier /etc/crontab
Les règles se construisent comme indiqué :
# m h dom mon dow command

m est pour minutes [0-59]
h est pour heure [0-23]
dom est pour journée du mois [1-31]
mon est pour mois, de janvier à décembre [1-12]
dow est pour journée du dimanche au samedi [0-6]
command est le chemin d’accès absolu de votre script

Voici des exemples de règles cron :

Exécuter un script à tous les jours à minuit

Exécuter un script le lundi à 14h30

Exécuter un script à toutes les heures

Exécuter un script à toutes les 30 minutes

Enregistrer le fichier, et c’est fini. Ok, pour nous qui avons grandit avec ça, c’est évident, mais il faut aussi penser à ceux qui débutent. Have fun!

AWK par l’exemple

Dans cet article, je vous propose de découvrir l’utilisation de awk (en ligne de commande, et non en script) pour lire ou analyser des fichiers, texte ou CSV, contenant plusieurs délimiteurs ou séparateurs.
Prenons comme exemple ce fichier texte (Prénom, département, mois, jour de naissance, nombre de frères, nombre de sœurs) :

 1. Pour imprimer la 3ème colonne contenant la date de naissance :

En précisant -F’:’ nous précisons à awk que le délimiteur est le caractère ‘:‘ . La troisième colonne correspond donc à $3


2. Pour imprimer le mois de naissance, la 3ème colonne tout séparateur confondu :

En précisant -F'[:;]’ nous précisons à awk que les délimiteurs sont les caractère ‘:‘ et ‘;‘ .


3.  Ajouter des variables, savoir combien de frères et sœurs ont les personnes :

On demande à awk de faire l’addition entre frères et sœurs, et on affiche le résultat.


4. Grouper / Dégrouper des variables en affichant plusieurs lignes pour la même personne :

Nous avons donc pour chaque personne une ligne avec le mois, le jour et l’année de naissance.


5. Utiliser les variables spéciales :

Les variables prédéfinies :
ARGC Nombre d’arguments de la ligne de commande
ARGV tableau des arguments de la ligne de commande-
FILENAME nom du fichier sur lequel on applique les commandes
FNR Nombre d’enregistrements du fichier
FS separateur de champs en entrée
NF nombre de champs de l’enregistrement courant
NR nombre d’enregistrements deja lu
OFMT format de sortie des nombres
OFS separateur de champs pour la sortie
ORS separateur d’enregistrement pour la sortie
RLENGTH longueur de la chaine trouvée
RS separateur d’enregistrement en entrée
RSTART debut de la chaine trouvée
SUBSEP separateur de subscript

Amusez-vous bien!!

Alerte SMS en bash : Pré-requis

Que ce soit depuis vos serveurs hébergés chez Netissime, Dedibox ou OVH, qu’il s’agisse de vos serveur à la maison, ou de vos raspberry, il est toujours bon d’avoir les alertes des vos serveurs en « live ».

Les remontées d’alerte par SMS (“Short Message Service”) existent déjà chez les professionnels, et sont devenues essentielles dans le monitoring de systèmes d’informations critiques. Cependant, les services gratuits permettant d’utiliser les SMS depuis le système restent rare. Pour ceux là, soit vous disposez d’une usine à gaz avec PHP, Curl, etc…, soit vous mettez simplement en place une solution en bash avec googalert. Lire la suite »