Linux

Prendre en main UFW Uncomplicated Firewall sous Linux Ubuntu

Vous avez sans doute entendu parler de iptables, ce firewall très connu sous Linux, mais peut être u peu difficile à configurer car très technique et verbeux. Il existe un autre équivalent beaucoup plus friendly : UFW. UFW est un e interface d’accès à iptables, pour faciliter l’usage de ce dernier.

Un pare feu a pour rôle de bloquer le traffic réseau sortant ou entrant, sur le protocole que vous voulez (par exemple SSH, HTTP etc). Vous pouvez blocker des ports, des adresses IP et des intervalle d’adresses IP.

Installation de UFW et activation

Si ce n’est déjà installé vous pouvez faire la commande suivante:

$ sudo apt update
$ sudo apt upgrade
# vérification préalable de l'existence de UFW
$ which ufw


# le cas échéant
$ sudo apt-get install ufw

# après installation on véirifie l'état d'UFW
$ sudo ufw status verbose

-----------------------------
Output
Status: inactive

# on active UFW
$ sudo ufw enable

#pour désactiver
$ sudo ufw disable

La commande status est importante pour avoir l’état des lieux, je vous recommande de souvent la faire pour diagnostiquer des erreur.

On eptu utiliser une autre command pour avoir le status

systemctl status ufw
● ufw.service - Uncomplicated firewall
     Loaded: loaded (/lib/systemd/system/ufw.service; enabled; vendor preset: enabled)
     Active: active (exited) since Sun 2025-02-16 09:12:11 CET; 30min ago
       Docs: man:ufw(8)
   Main PID: 129 (code=exited, status=0/SUCCESS)

Feb 16 09:12:11 PC-YVON systemd[1]: Starting Uncomplicated firewall...
Feb 16 09:12:11 PC-YVON systemd[1]: Finished Uncomplicated firewall.

Autoriser un port sur un protocol : port 80 sur TCP

# va autoriser les connexion HTTP (web)
$ sudo ufw allow 80/tcp

Rule added
Rule added (v6)

Status: active
Logging: on (low)
Default: allow (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
80/tcp                     ALLOW IN    Anywhere
80/tcp (v6)                ALLOW IN    Anywhere (v6)

Nettoyer toutes les règles:

ufw reset

# après redémarrer
ufw enable

Liste des commandes de UFW:

Usage: ufw COMMAND

Commands:
 enable                          enables the firewall
 disable                         disables the firewall
 default ARG                     set default policy
 logging LEVEL                   set logging to LEVEL
 allow ARGS                      add allow rule
 deny ARGS                       add deny rule
 reject ARGS                     add reject rule
 limit ARGS                      add limit rule
 delete RULE|NUM                 delete RULE
 insert NUM RULE                 insert RULE at NUM
 prepend RULE                    prepend RULE
 route RULE                      add route RULE
 route delete RULE|NUM           delete route RULE
 route insert NUM RULE           insert route RULE at NUM
 reload                          reload firewall
 reset                           reset firewall
 status                          show firewall status
 status numbered                 show firewall status as numbered list of RULES
 status verbose                  show verbose firewall status
 show ARG                        show firewall report
 version                         display version information

Application profile commands:
 app list                        list application profiles
 app info PROFILE                show information on PROFILE
 app update PROFILE              update PROFILE
 app default ARG                 set default application policy

https://www.vps-mart.com/blog/how-to-configure-firewall-with-ufw-on-ubuntu

// Principales commandes de ufw
===============================
sudo ufw enable	
sudo ufw disable	
sudo ufw status	
sudo ufw status numbered	
sudo ufw allow 22	
sudo ufw allow http	
sudo ufw allow 8080/tcp	
sudo ufw deny from 192.168.1.100	"192,168,1,255 adresse de broadcast
decouverte de réseau
imprimante qui annonce sa disponibilité"
sudo ufw deny 23	
sudo ufw status numbered	
sudo ufw delete NUMERO	
sudo ufw reset	
sudo ufw allow from 192.168.1.0/24	"notation CIDR sert à représenter un bloc d'adresses IP, IP est codé sur 32 bits, ici 24 premiers bits sont fixes
Quelle plage d’adresses couvre ce bloc ? 192.168.1.1 à 192.168.1.254
/24 correspond à 255.255.255.0 (masque de sous réseau)"
sudo ufw deny from 10.0.0.0/8	
sudo ufw limit ssh	

Configurer le firewall Linux iptables

iptables est un firewall de Linux. La configuration est vaste car en matière de réseau il y a différents types de protocole. Par exemple si vous pingez une adresse IP c’est le protocole ICMP qui est en jeu. nftables est censé remplacer iptables.

Installation de iptables

apt install iptables

// connaitre la version de iptables
iptables --version

Concepts clé d’iptables

  • Tables, les 4 tables filter, nat, mangle,raw
  • Chains INPUT OUTPUT, FORWARD
  • Policies comportement par défaut d’une chaine (ACCEPT or DROP)
  • Rules règles appliquées au réseau

Lister et voir les règles

Pour voir les règles tapez la commande suivante :

iptables -L



Pour lister les règles avec leur numéro :
iptables -L --line-numbers

La politique par défaut c’est quoi?

Imaginez une clause switch case, le cas par défaut est celui qui n’est couvert par aucune règle.

Comment définir une politique par défaut?

avec le flag -P

iptables -P <chaine> <cible>

iptables -P INPUT DROP

iptables -P OUTPUT ACCEPT

iptables -P FORWARD ACCEPT

Le flag -P ne crée pas de nouvelle règle.

Exemple de politique par défaut

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

Exemple de règles

Ajouter une règle d’interdiction pour les ping (protocole ICMP)

#Tapez la commande suivante pour ajouter une règle à iptables
iptables -I INPUT -p ICMP --icmp-type 8 -j DROP

Bloquer les demandes SSH

iptables -A INPUT -i eth0 -p tcp --dport 22 -j DROP

Supprimer un règle

//Pour supprimer les règles :
supprime la règle 1
iptables -D INPUT 1

Création de règles

Autoriser SSH

sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

Autoriser HTTP et HTTPS

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

Autoriser le ping (ICMP)

iptables -A INPUT -p icmp -j ACCEPT

Autoriser le traffic local (loopback)

iptables -A INPUT -i lo -j ACCEPT

Refuser une IP spécifique

iptables -A INPUT -s 192.168.1.100 -j DROP

Limitation brute force

sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP

Exemple de configuration typique d’un serveur

# Vider les règles existantes
iptables -F
iptables -X

# Politique par défaut
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Autoriser loopback
iptables -A INPUT -i lo -j ACCEPT

# Autoriser les connexions établies
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Autoriser SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# Autoriser HTTP / HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# Autoriser ping
iptables -A INPUT -p icmp -j ACCEPT

// on sauvegarde les règles
iptables-save > /etc/iptables/rules.v4

C’est quoi le loopback?

C’est l’interface réseau de votre ordinateur, appelé lo (lettre l et lettre o)

Configurer fail2ban

Qu’est ce que c’est fail2ban?

Fail2ban, c’est un outil de sécurité pour les serveurs, principalement utilisé sous Linux. Son rôle principal est de protéger le serveur contre les attaques par force brute (par exemple, quand un attaquant essaie de deviner un mot de passe en tentant plein de fois de se connecter).

Voici ce que fait fail2ban concrètement :

  • Il surveille les fichiers logs des services (comme SSH, FTP, Apache, etc.) pour détecter des tentatives de connexion échouées répétées.
  • Dès qu’il remarque qu’une même adresse IP tente plusieurs fois sans succès (configurable), il va bloquer cette IP temporairement via le pare-feu (iptables, nftables, etc.).
  • Le blocage est temporaire (par exemple 10 minutes, 1 heure), mais si l’IP continue à poser problème, fail2ban peut prolonger ce blocage.
  • Cela limite efficacement les risques d’intrusion par brute force sans que tu aies à intervenir manuellement.

Ce que n’est pas fail2ban

Fail2ban ne va pas vous bloquer tout seul, il a besoin d’un firewall comme iptables pour le faire ou ufw. Fail2ban met juste en place des IP à bloquer.

Installer fail2ban

Si vous êtes sous Debian faites la commande suivante :

sudo apt install fail2ban

#apt est une nouvelle version de la commande apt-get, designé pour être plus ergonomique

Ensuite dupliquez les fichiers fail2ban.conf et jail.conf e, fail2ban.local et jail.local, c’est une habitude à prendre pour en cas de mise à jour de fail2ban, vous perdiez votre configuration.

Configurer fail2ban pour protéger ssh

Nous allons modifier avec vim ou nano le fichier jail.local. Comme nous voulons protéger dans cet article seulement sshd, nous allons trouver la section [sshd] et nous assurer de trouver les lignes suivantes

[sshd]

maxretry=2
findtime=600   #10 minutes soit 600 secondes
bantime=600  # temps d ebanissement

bantime est le temps de banissement, findtime est le temps durant lequel les tentatives infructueuses de login se déroulent, c’est la fenêtre d’observation.

Expérimentation:

Connectez vous à un compte et faites exprès d’échouer 2 sessions de connexion de suite.

Ensuite tentez de vous connecter à nouveau.

Quelques commandes relatives à fail2ban

connaitre l’état des lieux de fail2ban

# connaitre l'état des lieux des bans pour un programme comme sshd
fail2ban-client status sshd

#Redémarrer fail2ban après une modification de fichier d configuration

sudo systemctl restart fail2ban

Le fichier de log de fail2ban se trouve dans /var/log/fail2ban.log

en conjonction de fail2ban, il est intéressant de monitorer les logs de connexion du fichier auth.log. Si ce fichier n’est pas présent c’est qu’il faut installer via la command suivante :

sudo apt-get install rsyslog

NodeJS Express et variables d’environnement tout ce qu’il faut savoir

Vous connaissez tous ce code si vous avez fait du Node-Express :

const port = process.env.PORT || 3000;
const folder = process.env.FOLDER || '';

Lorsque vous démarrez votre serveur NodeJS, il écoute le port 3000 grâce à ce bout de code

app.listen(port, () => {
    console.log(`Server running on http://localhost:${port}`);
});


la ligne de code process.env.PORT || 3000; veut dire qu’en environnement de développement l’url pour atteindre le serveur est http://localhost:3000. Quid de l’environnement de production? Et d’abord, comment sait on que c’est pour l’environnement de production? Tout simplement en développement la variable port vaut 3000 car la constante PORT n’est pas définie en dévelolppement (normalement). En vertue de l’opérateur || (OU), ce sera al valeur 3000 qui sera assignée à al variable port.

En général en programmation, les constante (valeurs qui ne bougent pas sont en majuscule, et les variables en minuscule.

Considérons les différents cas de figure où la variable port peut être définie

Environnement local

On décide d’assigner une valeur à port (chose qu’on ne fait pas normalement) mais c’est pour illustrer. La commande ci-dessous est valable pour la session.

#MACOS/Linux
PORT=3000 node server.js

ou 
export PORT=3000
node server.js


#windows CMD
set PORT=3000
node server.js

Utilisation de fichier d’environnement

Créer un fichier .env
#installer dotenv
npm install dotenv


require('dotenv').config();

const port = process.env.PORT || 3000;
console.log(`Server running on port ${port}`);

configuration niveau système

Dans les systèmes Linux, vous pouvez ajouter la variable d’environnement au fichier .bashrc ou au fichier etc/environment

Faire une archive tar sans préserver les chemins de fichiers

Syntaxe usuelle d la commande tar pour la création d’une archive

soit la structure de fichiers suivant :
./test/folder1/folder1a/fichier1.txt
./test/folder1/fichier1.txt
./test/folder2/fichier3.txt


Nous sommes dans le répertoire test, et nous créons une archive de façon classique sans compression:
> tar -cvf archive.tar *

folder1/
folder1/folder1a/
folder1/folder1a/fichier1.txt
folder1/fichier1.txt
folder2/
folder2/fichier3.txt

Pour voir le contenu sans le désarchiver

> tar -tf archive.tar

folder1/
folder1/folder1a/
folder1/folder1a/fichier1.txt
folder1/fichier1.txt
folder2/
folder2/fichier3.txt

Nous voyons que les fichier ainsi que les dossiers sont préservés, ainsi si vous décompressez l’archive dans un autres répertoire, la structure sera conservée.

Archiver avec tar sans garder la structure des fichiers

Parfois on a envie de rassembler tous les fichiers sans conserver l’arborescence, dans un unique répertoire. Voici comment faire :

On se place dans le répertoire à archiver.
> find . -type f | tar --transform='s|^\./||;s|/|_|g' -T - -cvf archive.tar

on pipe deux commandes
find .-type f va trouver tous les fichiers à partir de là où se trouve l'invite de commande

Le seconde commande va archiver avec une transformation, on renomme les fichiers qui sont à archiver pour les rendre uniques. Le format du nom du fichier est composé de mot du chemin vers le fichier dont les slash seront transformés en underscore.

> tar -tf archive.tar
folder1_folder1a_fichier1.txt
folder1_fichier1.txt
folder2_fichier3.txt

Le renommage est plus prudent car on peut avoir deux fichiers du même nom.

Se connecter à un droplet DigitalOcean avec Putty

Vous devez avoir fait la création d’une paire de clé privée-public. Ensuite lors de la création de votre droplet, vous aurez uploadé la clé publique sur digitalOcean.

Nous allons faire la connexion avec Putty

D’abord localisez l’adresse IP de votre Droplet, ouvrez Putty et mettez l’adresse IP. Puis allez dans Auth, puis ajoutez votre clé privée au format .ppk Le soucis c’est qu’avec ssh-keygen, vous ne générez pas de .ppk, il vous faudra l’utilitaire Puttygen.

Création de la clé privée au format .ppk

Dans Puttygen, chargez votre clé privée et sauvez la.

Importez la clé

Sélectionnez votre clé privée (la clé sans extension)

Chargez la clé

Vous pouvez sauver votre clé sans passphrase (c’est plus simple)

Retour dans Putty

Ajout de l’utilisateur, aller dans Connection > data

Sauvegarder les données de la session pour ne pas avoir à les retaper

Dans le cas où cela ne marcherait pas essayez de télécharger la dernière version de Putty, j’étais pour ma part en 0.72 et en mettant à jour vers la 0.81 ça marche.

Processez des fichier CSV avec AWK pour faire des requêtes SQL

AWK est un utilitaire du monde UNIX et Linux, très puissant et très rapide, très adapté dans le traitement de ligne.

awk -F "," '{print "INSERT INTO table (last_name,first_name,email) VALUES ('\''"$1"'\'', '\''"$2"'\'','\''"$3"'\'');"}' test.txt

Les difficultés relatives à AWK

J’ai rencontré les plus grandes difficultés lorsque j’ai dû concaténer les colonnes du fichier texte. En effet dans une requêtes SQL de type INSERT, il y les valeurs à entourer d’apostrophe dans le fichier de sortie, donc il faut échapper le caractère apostrophe, et ce n’est pas un simple backslash, car le backslash doit être échappé par une apostrophe pour être reconnu comme un backslash d’échappement !

  • https://unix.stackexchange.com/questions/593212/awk-print-apostrophe-single-quote
  • https://earthly.dev/blog/awk-csv/
  • https://www.tutorialspoint.com/awk/awk_basic_examples.htm
  • https://www.geeksforgeeks.org/awk-command-unixlinux-examples/

Linux

Compresser une dossier avec la commande tar (tarball)

Cette commande est rapide et puissante. Vous pouvez archiver une dossier complet, et avoir la possibilité d’excluer certains répertoire. Vous pouvez aussi à la volée compresser l’archive.

Archive simple

tar -cvf archive.tar /folder

Archiver en excluant des répertoires

$ tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .

Audit rapide d’un serveur Linux

Espace disque restant

$ du -sh /*

Type de distribution Linux

$ cat /etc/*release*

configuration matérielle (disques)

$ lsblk
#mémoire
cat /proc/meminfo

Mémoire RAM libre

$ free

Adresse IP

vim logo

Plugin Vim Pour PHPStorm

Comment installer IdeaVim

Aller dans paramètres, taper plugin dans la boite de recherche, taper « vim » dans la recherche de la marketplace, choisir ideaVim

configurer l’équivalent de .vimrc : .ideavimrc

Vous pouvez pomper les réglage de votre .vimrc en mettant source ~/.vimrc dans .ideavimrc.

ces deux fichiers doivent se trouver dans le répertoire home (Linux et Mac OS), c’est pour ça que vous voyez les caractère tilde ~.

Vous n’aurez pas toutes les feature de vim, c’est le défaut des plugins qui ne remplaceront jamais le vrai vim.

https://github.com/JetBrains/ideavim

vim logo

Les commandes VIM les plus courantes

Les différents mode en Vim:

Visual mode

Visual line mode : SHIFT + V

Command mode

Pour entrer en command mode, il faut taper les deux points « : »

Replace mode

Pour remplacer plusieurs occurrences d’un mot sous le curseur (opération assez courante) voici les combinaisons de touche, supposons que vous vouliez remplacer toto par tata :

# mettre le mot sur toto
# appuyer sur * pour aller à la prochaine occurence
# faire ciw (change inner word) puis entrez tata puis ESC
# puis autant de fois que nécessaire : appuyer sur n pour aller à la prochaine occurrence puis . (recommencer la dernière action)

Remplacer un seul caractère (sous le curseur)

Appuyer sur ‘r’ et taper la nouvelle lettre

Passer en Replace mode

SHIFT + r , permet de taper en mode remplacement, les caractère tapés remplacent les précédents caractères.

Visual Char mode : pour y entrer appuyer sur v, ça permet de sélectionner du texte

Obtenir de l’aide sur une commande

:help <command>

Edit mode

Comment faire une commande en navigation mode puis revenir de suite en edit mode

#il faut faire CTRL + o en edit mode pour temporairement être en normal mode, pratique pour aller en fin de ligne et continuer à éditer par exemple, <CTRL>+o rentre en normal mode pour une commande.
<CTRL>+o

#copier un mot sous le curseur, le curseur est au début du mot
yw
#copier un mot même si le curseur n'est pas au début du mot
yaw
#pour les nom de variable préfixée par un $  (ex: $this), yaw ne suffira pas dans ce cas utiliser le big word W (SHIFT + w)
yaW

#répéter un caractère 'J' 10 fois
<ESC>10iJ<ESC><ESC>

Changer la casse

Changer en minuscule ou en majuscule

 ~    : Changes the case of current character
 guu  : Change current line from upper to lower.
 gUU  : Change current LINE from lower to upper.
 guw  : Change to end of current WORD from upper to lower.<<utile
 guaw : Change all of current WORD to lower.              <<utile
 gUw  : Change to end of current WORD from lower to upper.<<utile
 gUaw : Change all of current WORD to upper.              <<utile
 g~~  : Invert case to entire line
 g~w  : Invert case to current WORD
 guG : Change to lowercase until the end of document.

Insert mode

Pour annuler une action, revenir sur normal mode en appuyant sur ESC ou CTRL+C, appuyer sur u en

Insérer un caractère plusieurs fois

<ESC> //nnormal mode
10    // nombre de fois
i    // insert mode
a    // le caractère
<ESC>  // quitter Insert mode

Bouger une ligne vers le haut ou vers le bas

Il faut utiliser la commande move .

:m 12  //bouge le ligne courante vers la ligne 12
:m 0   //bouge vers le début du fichier
:m $   // bouge après la dernière ligne du fichier
:5,7m 21   //bouge les ligne 5 à 7 à la ligne 21

Recherche

Rechercher une chaîne de caractères

Pour chercher un mot le plus simple est de rentrer le slash et de tapez la chaine à chercher

/motachercher
#s'il y a plusieurs occurences, appuyer sur n pour passer au suivant et SHIFT + n pour le précédent

Pour naviguer dans les occurrences trouvées utiliser les touches # (chercher en arrière)et * chercher en avant.

Rechercher le mot sous le curseur

#placer le curseur sur le mot et *

Rechercher la définition d’ue fonction

#placer le curseur sur le no de la fonction et
gd

Navigation mode

Naviguer dans Vim

CTRL + y : défile  d'une ligne vers le haut
CTRL + e : défile d'une ligne vers le bas
CTRL + f : défile d'une page vers le bas
CTRL + b : défile d'une page vers le haut
CTRL + d : défile d'une 1/2 page vers le bas
CTRL + u : défile d'une 1/2 page vers le haut

Placement du curseur sur l’écran

# position du curseur haut,milieu et bas (bouge le curseur)
H, M , L
#centrage du curseur dans la vue (ne bouge pas le curseur)
zt, zb ou zz

Placement du curseur au sein d’une ligne

#aller au dernier caractère et être en mode édition
SHIFT + A
#aller au dernier caraxtère
$
#aller au premier caractère et être en mode édition
SHIFT + I
# aller au premier caractère et curseur sur le 1er caractère
^^
#aller au premier caractère et curseur avant le 1er caractère
SHIFT + 0

Navigation par mot

#déplacer de mot en mot
w
#déplacer de mot en mot reverse
b
#déplacer de mot en mot en plus rapide (d'espace en espace en fait)
SHIFT + w
#reverse
SHIFT + b
#aller à la fin d'un mot
e
#aller début d'un mot 
w

Navigation par bloc (paragraphe…)

#les paragraphes sont séparés par une ligne vide ou des accolades
{ ou }
# aller au matching brace, trouver le } correspondant le plus immédiat de {, marche pour ( et [
%
# vous pouvez en profiter pour sélectionner le texte entre la paire de {}
v%
#voir le } correspondant, pour cela activer une option
:set showmatch

#Comment aller au {{[ le plus proche lorsque vous n'êtes pas dessus
[{  ou [[ ou [(  
#pour trouver celui qui est au dessus. Pour celui du dessous
]} ou ]] ou ])

Navigation par marks (signets)

Les signets (marks) permettent de mémoriser une ligne avec un raccourci (register), mais ne mémorise pas la colonne

#enregistrer un mark (les mark sont spécifiques à un fichier)
me // e devient le raccourcis vers le marks
#naviguer au mark
`m  // backticks ou
'm  // apostrophe (ideaVim ne connait pas backtick je crois)
#lister les marks
:marks
#revenir à la position précédente
``

#Les jumps
vous pouvez rejouer les positions du curseur avec CTRL + i et CTRL + o
#lister les positions passées du curseur
:jumps


#  https://www.linux.com/news/vim-tips-moving-around-using-marks-and-jumps/

Copier Coller avec les registers sous Vim

Alors que la plupart des programmes ne disposent que d’une copie dans le clipboard, Vim en possède une dizaine, on se demande pourquoi par défaut ce n’est pas proposé dans les autres IDE.

Le registre par défaut est "", le contenu y est présent lorsque vous faites un d,c,s,x,y

" est utilisé pour accéder au register,

# utilisation basique copier coller, utilisez une lettre pour stocker le contenu copié
"ey // copier le contenu dans le register e y=yank
"ep // coller le contenu du register e
#voir les contenus des register
:reg
:reg e f h // que les registers cités

https://www.brianstorti.com/vim-registers/

Effacer avec VIM

Effacer et combinaison avec d’autre commandes

Effacer en avant ou en arrière

$ phrase exemple : "ceci est une phrase de pour illustrer le propos"
#curseur sur h de phrase
#effacer jusqu'à la lettre 'd'
dtd
#effacer en arrière jusqu'à 'u'
dTu
#effacer un mot sous le curseur, attention à la position du curseur, l'effacement se fait depuis le curseur jusqu'à la fin du mot
dw

#efface le mot entier quelque soit la position du curseur sur le mot
diw

#effacer le contenu à l'intérieur des parenthèses ou crochet ou accolade, remplacer <char> par (,{,[
di<char>

#effacer jusqu'à un caractère
dt<char>

Les sources:

https://opensource.com/article/19/2/getting-started-vim-visual-mode

Déplacer des lignes

Sans doute une de mes commandes préférée, vous pouvez bouger une ou des lignes, en absolue sans forcément depuis la position de votre curseur

#déplacer la ligne courante à la ligne 23
:m 23
:m 0
:m $

#déplacer un bloc
:m5,7m 21 // bouge block lignes 5à7 à la ligne 21

Déplacer des lignes en mode relatif

Lorsque vous avez activé le display des ligne en relatif, vous n’avez plus les numéros absolu cela peut être une gêne, mais il est possible de déplacer les lignes en relatif depuis la position de votre curseur.

#sélectionner votre ou vos lignes en mode visual block (SHIFT + V), taper :m, puis le nombre de ligne en relatif, donc pour déplacer en amont de une ligne
:'<,'>m-2 // oui -2 et pas -1
#remarquez la syntaxe assez compliquée avec les chevrons, ne vous en faites pas, ils se font automatiquement si vous vous placez en mode Visual Block

Visual block mode ou mode colonne

Le visual block mode est l’équivalent du mode colonne dans une EDI classique. Pour y basculer CTRL + v. un fois ceci fait, il faut sélectionner les lignes avec j. Exemple faire attention, l’exemple ci-dessous permet d’insérer sur toutes les lignes sélectionnées un même texte, mais c’est avec SHIFT + i qu’on va insérer et pas seulement i comme en mode normal.

#exemple de texte
Vim is a text editor
Vim is a text editor
Vim is a text editor
Vim is a text editor
#on veut ajouter great entre "a" et "text"
#curseur sur la première ligne et devant "text" puis CTRL + v
#j 4 fois, puis SHIFT + i, on insère "great", deux fois <ESC> pour sortir du visual block mode.
#pour effacer, sélectionner c'est intuitif.

Bonus : Utiliser vi sur la ligne de commande bash

Il est possible en faisant simplement une commande pour avoir la sensation d’être dans vi, le curseur ne change pas quelquesoit les modes.

set -o vi

Utiliser les macros en Vim

Les macros je n’ai pas besoin de vous expliquer, ce sont des suites d’actions que vous pouvez réappliquer

# démarrer l'enregistrement de la macro et lui assigner un raccourci lettre a
qa
....vous commandes
#arrêt de l'enregistrement de la macro vim
q
#exécuter votre macro
@a
#répéter l'exécution de votre macro

Pour faire de bonnes macros, il faut réfléchir un peu, si par exemple vous devez appliquer une action sur une liste (typique) commencer par placer votre curseur de façon tactique pour le début et la fin.

Normal mode

https://betterprogramming.pub/50-vim-mode-tips-for-ide-users-f7b525a794b3

Il y a de la redite mais, il y a des commandes additionnelles que je trouve intéressantes :

r en normal mode permet d'éditer le caractère sous le curseur tout en restant en normal mode, alors que s vous met en insert mode.
cw en normal mode permet de changer un mot (bascule en insert mode), alors que dw efface le mot (vous restez en normal mode)
% permet de trouver le (,{,[ matchant celui sous le curseur. % n'importe où va jusqu'au prochain ),],}.
H,M,L permet de déplacer le viewport, le curseur reste immobile
zz,zt,zb  bouge le curseur dans le viewport
Text Object : permet d'agir sur le mot où qu'on soit dans le mot (évite d'aller au début du mot poru effacer le mot par exemple)
daw : supprime le mot où que soit le curseur dans le mot
ciw : efface le mot et passe en insert mode

Insérer un newline sous le cursor en normal mode : il faut faire un remap qui correspond à i<Entrée>
nnoremap <Enter> i<Enter><Esc>k$
Changer les caractères entourant un mot (" ou ') (suround)
"Hello"  => 'Hello' : cs"'
Replace mode : R, remplace les caractère en normal mode.<Es> pour en sortir.
u et CTRL + R : undo et redo 
Voir aussi la section sur Splitting Windows
Navigation occasionnel en insert mode:
CTRL + o puis f g  (recherche de la lettre 'g') vous restez en insert mode, on n'y gagne rien.
Efface ligne et reste en insert mode : c$ (en fait depuis n'importe quelle position dans la ligne.
Efface depuis le curseur vers la fin du mot et reste en insert mode : cw
#effacer en arrière
d<flècheGauche>  efface le caractère à gauche
d$  efface depuis le curseur jusqu'à la fin de la ligne
d^  efface en arrière depuis le curseur jusqu'au caractère non espace 
d0  efface depuis le curseur en arrière jusqu'au début de la ligne
dw  efface depuis le curseur jusqu'à la fin du mot
db  efface en arrière depuis le curseur jusqu'au début du mot

#effacer en arrière et basculer en edit mode, remplace d par c
c<flècheGauche>  efface le caractère à gauche
c$  efface depuis le curseur jusqu'à la fin de la ligne
c^  efface en arrière depuis le curseur jusqu'au caractère non espace 
c0  efface depuis le curseur en arrière jusqu'au début de la ligne
cw  efface depuis le curseur jusqu'à la fin du mot
cb  efface en arrière depuis le curseur jusqu'au début du mot

VIM pour le HTML

Travailler en HTML supppose certaines actions que l’on rencontre peux en mode texte normal, par exemple aller à l’intérieur de tag HTML, effacer l’intérieur de tag HTML

effacer le texte entre les tags HTML ex:
<h1>Le sous titre</h1>
se placer entre les tags et faire : dit
cit pour passer en mode insertion après
effacer entre les parenthèses:  di(  ou ci(
effacer entre les guillemet : di"  ou encore mieux ci"
idem avec [,{,',<...

Les différents modes de VIM

  • normal mode
  • Insert mode
  • command mode
  • visual mode
  • select mode

Exécuter une commande shell depuis VIM

#Pour exécuter une commande shell
:!commande shell


#Pour exécuter un scriptshell qu'on est en train d'éditer
:!./%

Le % représente le nom de notre fichier

Cas particulier de Tmux:

Dans µTmux il est possible de exécuter une commande shell et diriger la sortie vers un autre panneau

exécute la commande et redirige la sortie vers le panneau 2
tmux run-shell -t 2 echo "Hello" 

On veut exécuter le programme depuis VIM et la sortie de l'exécution sera sur un autre panneau,
donc c'est une combinaison de redirection et d'exécution d'un script dans VIM

:!tmux run-shell -t 2 ./monscript.sh

Diverses commandes

SHIFT + j : supprime les retours chariot, 
Mode colonne, CTRL + V, puis j ou k, passer en INSERT MODE
linux logo

GNU Parallel pour accélérer vos process sous Linux

Soit un fichier avec 1000 urls à curler pour en connaitre la réponse HTTP seulement (le header seulement seulement pas le body)

time while read -r line;
do curl --head -k -s $line|grep HTTP;
done < url.txt


time while read -r line;
do parallel -I% --max-args 1 curl --head -k -s $line|grep HTTP;
done < url.txt


time while read -r line;
do parallel --jobs 5 -I% --max-args 1 curl --head -k -s $line|grep HTTP;
done < url.txt

Experimentation avec l’augmentation du nombre de jobs

Un paramètre intéressant à jouer avec est le nombre de jobs. Pour 1000 urls à checker le header HTTP, voici les temps :

  • Sans parallel : 1m57s
  • Avec Parallel par défaut : 42s
  • Avec Parallel --jobs 5 : 32s
  • Avec Parallel --jobs 10 : 23s

Il suffit de trouver le meilleur compromis (pas de proportionnalité entre le gain et le nombre de jobs.)

Linux

Convertissez les videos Youtube en mp3 sous Linux

Voici un tuto rapide à faire sous Linux pour télécharger une vidéo Youtube et la convertir en mp3.

Juste pour vous montrer la commande shell wget et comment manipuler les conversion multimédia.

Wget, une commande bien pratique pour télécharger des fichiers sur le web

J’utilise principalement WGET pour télécharger le dernier zip de WordPress et le décompresser dans le répertoire de mon site web, cela va bien plus vite que de charger depuis votre disque dur via ftp.

Dans sa plus simple expression Wget est suivi de l’url du fichier sur le web, par exemple pour télécharger le fichier de la page d’accueil de Google.fr, on fait:

$wget https://www.google.fr

Ceci aura pour effet de créer un fichier index.html qui contient le source code de la page.

Pour télécharger l’archive de WordPress, il suffit de faire:

$wget https://worpress.org/latest.zip

Télécharger une vidéo Youtube

Pour télécharger une vidéo Youtube, utiliser Wget ne marchera pas car ce dernier va vous télécharger la page web, et en ce qui concerne le fichier de la vidéo, comme c’est du streaming, ce ne sera pas possible.

Fort heureusement sous Linux, il y a un utilitaire qui s’appelle youtube-dl qui fonctionne « à la manière de » wget.

Tout d’abord nous allons installer youtube-dl, malheureusement ce ne sera pas avec apt-get sous Debian Jessie, vous aurez un message comme quoi le paquet est manquant. En fait il n’est pas dans les dépôts par défaut.

Par contre il est possible de télécharger depuis le site officiel et on va le faire avec wget !

$sudo wget https://yt-dl.org/latest/youtube-dl -O /usr/local/bin/youtube-dl
$sudo chmod a+x /usr/local/bin/youtube-dl
$hash -r

La première ligne va cherche le programme, la seconde va le rendre exécutable, et la troisième ligne permet d’éviter de chercher dans $PATH à chaque fois que vous allez taper la commande youtu-dl.

Télécharger une vidéo Youtube

A noter que youtube-dl peut marcher avec d’autres plateforme de streaming, je n’ai pas essayé.

Voici la commande pour télécharger une vidéo Youtube, d’abord allez sur la vidéo et copiez l’url de la vidéo Youtube et faites cette commande :

$youtube-dl -o /home/myfoldr/mp3 https://www.youtube.com/watch?v=3zy2pBoTuOQ

Ceci sauvegardera dans un répertoire qui aura pour nom le titre de la page web. Le switch -o indique où seront déposés le fichier.

Ensuite il faudra le convertir en mp3

Convertir en mp3 avec Avconv

$sudo apt-get install libav-tools

Avconv est sensiblement le même que ffmpeg. ffmpeg n’étant plus dans le repo de Jessie (en tout cas je n’ai pas réussi à l’installer, on va se contenter d’utiliser Avcon, la différence notable est que les fichier .srt (sous-titre de film) ne sont pas suportés par Avconv.

 

$avconv -i /chemin-vers-mp4 -vn filename.mp3

A noter que l’argument -vn va rendre votre encodage beaucoup plus rapide, car on n’a pas besoin de la video, on veut que la bande son, donc si vous ne mettez pas cet argument la conversion sera très lente.

Bonus : télécharger directement en mp3 !

Avec la commande suivante vous pouvez télécharger directement en mp3 soit autant de temps gagné :

$youtube-dl -i --extract-audio --audio-format mp3 --audio-quality 0 URL_YOUTUBE

Pour avoir le nom bien formaté (car par défaut il y a l’id de la video qui est dans le nom du fichier) :

$youtube-dl -o "%(title)s.%(ext)s" -i --extract-audio --audio-format mp3 --audio-quality 0 URL_YOUTUBE

 

 

source : https://doc.ubuntu-fr.org/youtube-dl

 

 

Linux

Compiler un programme sous Linux

Pourquoi compiler un programme ?

Pour qui n’a jamais fait ce genre de manipulation ça peut paraître terrifiant.

Mais après avoir passé 3 semaines  scotché sur un problème insoluble autre que  par la montée en version mineure de la bibliothèque ImageMagick. En effet j’avais à convertir un fichier SVG tout en préservant la transparence et aux bonnes dimensions en pixel sur un soft développé à l’origin pour fonctionner avec Imagemagick.

Le problème s’est posé après que j’ai migré l’application sur un nouveau serveur avec une distro Linux différente qui ne proposait pas encore la version 6.9.9 de Imagemagick dans son gestionnaire de package (je parle de Debian 8 qui vient avec Imagemagick 6.8 !). Après des errement avec Inkscape, qui ne résolvait pas le problème, j’ai décidé de faire violence de télécharger la version 6.9.9 d’Imagemagick et de le compiler !

Comment compiler un programme sous Linux?

D’abord il faut télécharger les fichiers sources, mais aussi les dépendances, un bon wget fera l’affaire. décompresser dans un répertoire. J’ai téléchargé le zip sur un site qui héberge la librairie Imagemagick pour Linux.

ensuite il y a la configuration, pour ce faire, aller dans le répertoire, et faire la commande

./configure

Ensuite faire la commande make qui va faire la compilation proprement dite (sous root ou en sudo)

make
ou
sudo make

Si la compilation s’est bien déroulée, il faut  installer le programme dans le système.

make install
ou
sudo make install

Il se peut que vous ne puissiez pas faire marcher le programme, il faut configurer les liens dynamiques de runtime :

ldconfig /usr/local/lib
ou
sudo ldconfig /usr/local/lib

finalement faire un make check pour valider que le programme fonctionne bien.

 

Linux

Mettre un process en background

Il est assez intéressant de savoir passer un processus en background si ce dernier dure longtemps, afin d’avoir la main pour lancer autre chose (sans ouvrir une autre fenêtre shell).

Mettre un process en background dès le lancement

Imaginez que vous ayez lancé une commande « find »

find ./ -type f "fichier"

 

Cette commander peut durer plusieurs secondes ou minutes sur un serveur lent. On va le lancer directement en tâche de fond.

find ./ -type f "fichier" &

 

Mettre un process déjà engagé en background

Vous avez lancé une commande mais oublié de le mettre dès le lancement en background, ou alors elle dure plus longtemps que prévu, pas de panique, vous pouvez toujours le mettre en bacground.

find ./ -type f "fichier"
[CTRL+Z]
bg

En faisant Control+Z, vous reprenez la main sur le shell et vous pouvez taper « bg » pour mettre le process background.

Remettre un process en foreground

Finalement vous décidez de remettre en avant le process qui a été mis en background, c’est possible tout simplement avec la commande « fg »

fg

Oui mais ça marche pour le dernier process lancé, comment faire si vous avez lancé plusieurs process? Grâce à la commande « jobs », vous pouvez lister les commandes qui sont en background.

jobs

[1]   Stopped                 vim
[2]-  Stopped                 bash
[3]+  Stopped                 vim 23

fg %3 pour ramener vim 23 en avant plan.

 

Mettre un process en background et le détacher du shell

Ok, tout ce qu’on a vu jusqu’à présent, et relié au shell courant, c’est à dire que si vous fermez la fenêtre du shell, la commande en background va s’arrêter.

Afin de rendre le processus indépendant du shell, il faut le détacher du shell. Ceci se fait grâce à al commande nohup.

nohup find ./ -type f "fichier"

Cette commande va aussi générer un fichier log nohup.out dans le répertoire home.

Détacher un process existant du shell

Avec « nohup » vous détachez d’emblée un process du shell, mais il est possible de détacher après coup.

find ./ -type f "fichier" &
disown

grâce à la commande « disown », on détache après coup un process du shell. Faire le contraire de « disown » n’est pas implémenté dans Linux et ne sera pas traité. Si vous voulez arrêter un job, il faudra utiliser la commande « kill ».

Utilisé de concert avec la commande « jobs », utilisez le paramètre -h pour indiquer quel job détacher du shell.

disown -h %3

 

 

Locker un fichier pour éviter qu’il ne soit exécuté deux fois en même temps

Parfois il est nécessaire qu’un fichier ne s’exécute qu’en une seule instance. Par exemple un fichier php qui est inscrit dans une tâche CRON et qui doit mettre à jour une table soit être le seul à tourner, sinon on saboterait l’intégrité des données de la table.

Sous Linux, pour éviter qu’une tâche CRON soit la seule à tourner, il y a différentes manières plus ou moins simples.

Locker un fichier

CRON lui même ne sait pas empêcher qu’un fichier puisse être appelé plusieurs fois en concurrence. Il n’y a aucun moyen d’empêcher cela. LE concept d’empêchement de lancer un second processus s’appelle le locking.

* * * * flock -n /var/lock/myjob.lock /path/to/script

dans l’exemple ci-dessus, la commande flock crée un fichier de lock, pour l’exécution du fichier script.

Il existe un programme qui s’appelle lockrun et qui permet de lancer un job et de locker le fichier en une seule commande.

Lockrun

lockrun --lockfile=/var/tmp/mylock myscript.sh

 

 

linux logo

Linux customiser son bash shell

Le shell est l’invite de commande du terminal Linux (ou Unix), c’est cet écran noir qui fait un peu peur au début, mais qui est très puissant, et quand vous aurez commencé à le maitriser, vous ne pourrez plus vous en passer, et sera une arme à votre trousse d’outils de développeur.

Où se trouve le fichier de customisation du shell?

Le fichier s’appelle ou .bash_profile (ou .bashrc) et se trouve dans le répertoire home de l’utilisateur. Mais attention au démarrage du shell, le fichier .bashrc n’est pas lu pour plus d’informations voir cette source.

Que customiser ?

Le $PATH

Le $PATH est l’ensemble des chemins de fichiers vers des exécutables, voici un extrait :

export PATH="~/.composer/vendor/bin"
alias composer="php /usr/local/bin/composer.phar"
export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/usr/local/mysql/bin:$PATH
 

Note : J’ai passé pas mal de temps sur MacOS à faire marcher le path pour Mysql, j’avais le fichier comme ceci :

export PATH=/usr/local/mysql/bin:$PATH
export PATH="~/.composer/vendor/bin"
alias composer="php /usr/local/bin/composer.phar"
export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/usr/local/mysql/bin:$PATH

Je n’ai jamais réussi à faire marche le PATH de cette façon, il a fallu que je l’incorpore dans la dernière ligne pour la mettre à la suite des autres déclaration pour que le shell en tienne compte.

Pour confirmer que la variable $PATH contient bien les chemin, faites la commande :

echo $PATH

Notez que si vous venez de faire le changement dans le fichier .bash_profile, quand vous sortez de l’éditeur texte, les changements ne sont pas appliqué, il vous faut sour ouvrir un nouveau shell (ce qui aura pour effet de lire le fichier .bash_profile), ou alors si vous voulez appliquer les changemnet dans la fenêtre courante :

source ~/.bash_profile
. ~/bash_profile (version courte)

Changer la couleur du prompt

Par défaut dans le bash, il y a deux couleurs, une couleur PS1 lorsque le shell est prêt à lire une commande, et une couleur PS2 quand le prompt attend un argument à la commande. Le bash permet de customiser ces couleurs. Regardons ce que donne l’écho de la variable d’environnement PS1 :

echo $PS1

\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$

Que signifient les caractères anti slashés?

\h : le nom du host

\u : le user name

\w : le répertoire courant

\$ :  affiche # si le user est root, UID = 0, sinon affiche $

Pour changer la couleur du prompt tapez cette commande :

export PS1="\e[0;31m[\u@\h \W]\$ \e[m "

Le 0;31 est la couleur rouge, pour le vert c’est le 0;32, vraiment pas facile à se rappeler, n’oubliez pas que ça date tout ça ! Pour avoir la version couleur plus light, rouge light  : 1;31.

L’autocomplétion

L’autocomplétion peut se paramétrer pour l’utilisateur non root en touchant au fichier /etc/passwd

Ce fichier qui n’est modifiable que par root contient les mot de passe de chaque utilisateur, et aussi son shell. Pour l’utilisateur apache le shell est nologin, ce qui veut dire que que cet utilisateur ne peut pas se logger. L’utilisateur root est /bin/bash, les autres utilisateurs sont souvent en /bin/sh, qui ne proposent pas l’autocomplétion. Donc il vous suffit de modifier en /bin/bash pour avoir l’autocomplétion.

Navigation dans l’historique

Saviez vous qu’il n’était pas utile de retaper une commande si vous l’avez déjà tapé? pour ce faire il vous suffit d’utiliser les toucher fléchées, HAUT et BAS pour naviguer entre les commandes déjà tapées. L’historique bash se trouve dans un fichier .bash_history.

Installer le shell Linux (ubuntu) dans Windows 10 !

Un shell Linux dans Windows

Il est loin le temps où Microsoft voulait imposer sa technologie (perfectible la plupart du temps) à tout le monde, et maintenant doit faire des concessions au monde du libre  qu’il a tant détesté car ne générant pas d’argent pour lui. Aujourd’hui Microsoft s’ouvre de plus en plus au monde du libre, jusqu’à avoir une shell embarqué Linux !

C’est une super nouvelle pour moi qui suit habitué à Linux, j’adore le bash, je déteste le Powershell qui est une abomination selon moi. Je vais vous montrer comment activer dans votre Ubuntu dans Windows !

Activer le mode développeur

Dans le champ en bas à gauche de votre écran (champ Cortana) tapez « paramètres », entrez dans le programme et allez dans Security&Updates, puis cochez activer pour développeur, attendez une dizaine de minutes.

Activer la fonctionnalité Linux

Pour ce faire tapez dans le champ Cortana « Panneau », cliquez sur « Programme et Fonctionnalités », puis « Activer ou désactiver des fonctionnalités Windows », puis cocher la case Sous-système Windows pour Linux.

Installation de Ubuntu

Ensuite toujours dans le champs Cortana, tapez « bash », cliquez dessus, une fenêtre de commande s’active, et vous dit de télécharger depuis l’appstore, tapez le lien fournit, et installez Ubuntu, ça prendre une dizaine de minutes (une url vous sera donnée pour accéder à l’appstore).

Dans le champs Cortana, tapez « bash », vous verrez le programme Ubuntu, épinglez à la barre des tâches pour un accès facile plus tard l’icône Ubuntu. Il vous sera demandé de créer votre compte. Vous devez redémarrer l’ordinateur.

ubuntu windows

 

Ensuite collez l’url montrée sur l’écran pour aller à l’appstore de Microsoft

 

Cliquer sur une distribution pour l’installer (Ubuntu)

Ensuite le bash s’ouvre et il vous sera demandé de créer votre user.

Accéder à la partition de Windows

Voilà, c’est tout. Maintenant voyons comment accéder à la partition de Windows, car une fois le compte créé vous êtes dans Ubuntu, donc en principe par grand intérêt.

Dans Linux, il y a la notion de montage de partition. On monte un disque dur virtuel ou réel, comme on monte une clé usb, un drive en réseau, c’est très puissant comme concept, mais en plus c’est très intuitif, tout est traité sur un pieds d’égalité ce qui facilite la compréhension.

Le point de montage est dans le répertoire /mnt/c, allez y vous allez trouver le drive c, qui est votre disque C.

 

 

linux logo

Changer les attribut de fichier dans Linux avec Chattr

Récemment  j’ai eu un site victime d’injection de code, plus exactement le fichier de paiement a été modifié pour intégrer une page de paiement factice afin de siphonner les numéros de carte bancaire.

Ce fichier PHP était modifié à chaque fois que je remettais le fichier non corrompu !

Il a fallu le rendre immuable avec une commande Linux, chattr (change attribute)

Syntaxe :

chattr +i nom_fichier

Si vous le faites sous root, c’est bon, à moins que le pirate n’ai eu accès en root à votre console !

Pour voir que le fichier a bien été modifié, utilisez la commande lsattr.

lsattr nom_fichier
----i----------- nom_fichier

Maintenant essayez d’effacer le fichier

rm nom_fichier
rm: cannot remove 'nom_fichier' : Operation not permitted

Pour enlever l’immuabilité :

chattr -i nom_fichier

 

Autres attributs

Append avec +a, en rendant un fichier +a, tout le monde pourra ajouter du contenu (append), mais ne pourra pas effacer le contenu précédemment entré

chattr +a toto.txt

Et si on essaye de remplacer le texte on aura une erreur :

echo 'un autre texte' > toto.txt
-bash: toto.txt: Operation not permitted

 

 

 

 

debian

Maîtriser les liens symboliques dans Linux

Les liens symboliques dans Linux un must-know

Les liens symboliques sont comme des raccourcis dans Windows,

Création d’un lien symbolique

Faire attention à l’ordre du lien symbolique et du chemine du fichier vers lequel on pointe

ln -s /path/to/file /path/to/symbolic_link

Le paramètre -s spécifie la création de lien symbolique et non de lien dur (symbolic link contre hard link). La distinction est expliquée sur cette page.

Effacer un lien symbolique

rm /path/to/symbolic_link

 

Résoudre les problèmes avec les liens symbolique

Le lien apparait en rouge

lien symbolique

Le lien pointe sur une ressource qui n’existe plus (en général vous avez mal orthographié)

Pour voir plus sur le status du lien faire :

>file apache-accesses
apache-accesses: broken symbolic link to `/usr/share/munin/plugin/apache-accesses'

Pour réparer, eh bien effacez le et recommencer la création du lien

 

debian

Monitorez des serveurs Linux avec Munin

Munin

Monitorez plusieurs serveurs dédiés depuis une seule interface web

Munin est un script pour monitorer un serveur Linux, il monitore des programme comme Apache, Mysql, l’activité du disque, le CPU,les process, le serveur de mail Postfix et plus encore, via un système de plugin, donc une installation standard nécessite d’activer des plugin pour aovir tout ça. On va voir tout ça ne vous inquiétez pas !

Munin a la capacité de monitorer des serveurs autres que ceux sur lequel il est installé. Par exemple, soit le serveur principal sur lequel vous installez Munin Master, ce serveur aura l’affichage sur une page web des graphiques.

Pour monitorer un second serveur dédié, sur ce dernier il faut installer Munin Node, un programme différent spécialement pour ça. Un node est un serveur Linux qui n’est pas principal.

Peu importe le système d’exploitation (Linux, Windows), les données sont rapatriés en mode texte vers le node maître. Donc il suffit pour vous d’installer et de configurer le node secondaire, faire un petit paramétrage, et du côté du node maître de configurer le node secondaire (donc faire une configuration sur les deux serveurs).

Installation de Munin Master

Je suppose que Apache a été déjà installé, on va installer munin maître, cette installatin est plus longue que pour  installer munin-node sur un serveur à monitorer.

apt-get install -y munin

Configurer le fichier /etc/munin/munin.conf, décommenter les lignes suivantes en début de fichier

dbdir     /var/lib/munin
htmldir   /var/www/munin
logdir    /var/log/munin
rundir    /var/run/munin
tmpldir /etc/munin/templates

Créer un utilisateur munin, et le répertoire web dans lequel Apache va accéder pour afficher les informations

Ensuite notion important, configurer le host tree pour le node master (oui on surveille le master et d’autres serveur dédiés)

[MuninMaster]  # avant renommage [localhost.localdomain]
    address 127.0.0.1
    use_node_name yes

Ensuite éditer le fichier apache24.conf

Alias /munin /var/www/munin

Ensuite effacer la section Directory pour la remplacer par ça :

<Directory /var/www/munin>
        Require all granted
        Options FollowSymLinks SymLinksIfOwnerMatch
</Directory>

Et pour la section Location, remplacer Require local par Require all granted pour permettre à toutes les IP de consulter la page de graphique Munin.

 

 

Installation de Munin Node

Sur le serveur node 91.111.111.110 :

#debian
apt-get install -y munin-node

#centos
yum install munin-node -y

Ensuite autoriser l’IP d’écoute dans le fichier /etc/munin/munin-node.conf,

allow ^111\.111\.111\.145$
allow ^::1$

Puis redémarrer le noeud

#centos
service munin-node restart

#debian
systemctl restart munin-node

Sur le serveur maître 111.111.111.145, configurer le node dans /etc/munin/munin.conf (ensuite redémarrer):

[MuninNode]
    address 91.111.111.110
    use_node_name yes

Dupliquez ces 3 lignes pour tout noeud supplémentaire.

Activation des plugins

Les plugins sont situés dans le répertoire /usr/share/munin/plugins, pour les activer il faut créer un lien symbolique vers le plugin dans le répertoire /etc/munin/plugins.

Il existe un utilitaire munin-node-configure qui permet d’auditer en ligne de commande les plugins.

Régler  les problèmes de Munin

 Le node secondaire n’apparait pas dans le panneau d’administration

Pour détecter ce qui ne vas pas, souvent pourquoi le node master n’arrive pas à rapatrier des données d’un node secondaire, il est utile de surtout regarder le fichier munin-update.log. Les raisons peuvent être multiples, vérifiez que vous pouvez  réussir un telnet vers l’adresse IP sur le port 4949.(ne pas utiliser nmap).

 

telnet 91.111.111.110:4949

Si vous avez un message d’erreur, service inaccessible, il se peut qu’une règle du firewall empêche la transmission de données. Ou alors que le service node secondaire n’ai pas redémarré.

 

Certains processus sont invisibles

Il peut apparaitre que certains processus ne soient pas visibles après le démarrage de munin-node, j’ai eu le cas d’Apache non visible. Dans ce cas l’utilitaire munin-node-configure peut être utile.

Un service n’est pas présent? vous pouvez utiliser munin-node-configure pour voir la liste des services :

munin-node-configure #va donner la liste des plugin actifs et non actifs.

munin-node-configure  --suggest #va suggérer la liste des plugins à utiliser, et donne aussi un message sur la raison de la non activation.

Voici un cas réel de message suite à l’ajout du paramètre –suggest :

Plugin                     | Used | Suggestions
------                     | ---- | -----------
acpi                       | no   | no [cannot read /sys/class/thermal/thermal_zone*/temp]
amavis                     | no   | no
apache_accesses            | no   | no [apache server-status not found. check if mod_status is enabled]
apache_processes           | no   | no [apache server-status not found. check if mod_status is enabled]
apache_volume              | no   | no [apache server-status not found. check if mod_status is enabled]
apc_envunit_               | no   | no [no units to monitor]
bonding_err_               | yes  | yes (bond0)
courier_mta_mailqueue      | no   | no [spooldir not found]
courier_mta_mailstats      | no   | no [could not find executable]
courier_mta_mailvolume     | no   | no [could not find executable]
cps_                       | no   | no
cpu                        | yes  | yes
cpuspeed                   | no   | no [missing /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state]
cupsys_pages               | no   | no [could not find logdir]
df                         | yes  | yes
df_inode                   | yes  | yes
diskstats                  | yes  | yes
entropy                    | yes  | yes
exim_mailqueue             | no   | no [no exiqgrep]
exim_mailstats             | no   | no ['/usr/sbin/exim -bP log_file_path' returned an error]
fail2ban                   | no   | no
forks                      | yes  | yes
fw_conntrack               | yes  | yes
fw_forwarded_local         | yes  | yes
fw_packets                 | yes  | yes
hddtemp_smartctl           | yes  | yes
http_loadtime              | yes  | yes
if_                        | yes  | yes (bond0 dummy0 eth0 ip6tnl0 tunl0)
if_err_                    | yes  | yes (bond0 dummy0 eth0 ip6tnl0 tunl0)
interrupts                 | yes  | yes
ip_                        | no   | no [could not run iptables as user nobody]
ipmi_                      | no   | no [missing ipmitool command]
irqstats                   | yes  | yes
load                       | yes  | yes
lpstat                     | no   | no [lpstat not found]
memory                     | yes  | yes
munin_stats                | no   | no [munin-update was not found at /usr/share/munin/munin-update]
mysql_                     | no   | no [Missing dependency Cache::Cache]
netstat                    | yes  | yes
nfs4_client                | yes  | yes
nfs_client                 | yes  | yes
nfsd                       | yes  | yes
nfsd4                      | yes  | yes
nginx_request              | no   | no [no nginx status on http://localhost/nginx_status]
nginx_status               | no   | no [no nginx status on http://localhost/nginx_status]
ntp_kernel_err             | no   | no
ntp_kernel_pll_freq        | no   | no
ntp_kernel_pll_off         | no   | no
ntp_offset                 | no   | no [no ntpq program]
ntp_states                 | no   | no [ntpq not found]
nvidia_                    | no   | no [no nvclock executable at /usr/bin/nvclock, please configure]
open_files                 | yes  | yes
open_inodes                | yes  | yes
pgbouncer_connections      | no   | no
pgbouncer_requests         | no   | no
postfix_mailqueue          | yes  | yes
postfix_mailvolume         | yes  | yes
postgres_autovacuum        | no   | no
postgres_bgwriter          | no   | no
postgres_cache_            | no   | no
postgres_checkpoints       | no   | no
postgres_connections_      | no   | no
postgres_connections_db    | no   | no
postgres_locks_            | no   | no
postgres_oldest_prepared_xact_ | no   | no
postgres_prepared_xacts_   | no   | no
postgres_querylength_      | no   | no
postgres_scans_            | no   | no
postgres_size_             | no   | no
postgres_transactions_     | no   | no
postgres_tuples_           | no   | no
postgres_users             | no   | no
postgres_xlog              | no   | no
proc                       | no   | no
proc_pri                   | yes  | yes
processes                  | yes  | yes
ps_                        | no   | no
qmailqstat                 | no   | no
selinux_avcstat            | no   | no [missing /selinux/avc/cache_stats file]
sendmail_mailqueue         | no   | no
sendmail_mailstats         | no   | no [no mailstats command]
sendmail_mailtraffic       | no   | no [no mailstats command]
slapd_                     | no   | no [IO::Socket::INET: connect: Connection refused]
slapd_bdb_cache_           | no   | no [Can't execute db_stat file '/usr/bin/db4.6_stat']
slony_lag_                 | no   | no
smart_                     | no   | no [no drives accessible]
snort_alerts               | no   | no [/var/snort/snort.stats not readable]
snort_bytes_pkt            | no   | no [/var/snort/snort.stats not readable]
snort_drop_rate            | no   | no [/var/snort/snort.stats not readable]
snort_pattern_match        | no   | no [/var/snort/snort.stats not readable]
snort_pkts                 | no   | no [/var/snort/snort.stats not readable]
snort_traffic              | no   | no [/var/snort/snort.stats not readable]
squeezebox_                | no   | no [no connection on localhost port 9090]
squid_cache                | no   | no [could not connect: Connection refused]
squid_objectsize           | no   | no [could not connect: Connection refused]
squid_requests             | no   | no [could not connect: Connection refused]
squid_traffic              | no   | no [could not connect: Connection refused]
swap                       | yes  | yes
threads                    | yes  | yes
uptime                     | yes  | yes
users                      | yes  | yes
varnish_                   | no   | no [varnishstat could not be found]
vmstat                     | yes  | yes
vserver_cpu_               | no   | no [/proc/virtual/info not found]
vserver_loadavg            | no   | no [/proc/virtual/info not found]
vserver_resources          | no   | no [/proc/virtual/info not found]
yum                        | no   | no [Could not find statefile.  Please read 'munindoc yum']
# The following plugins caused errors:
# fail2ban:
#       Junk printed to stderr
# pgbouncer_connections:
#       Junk printed to stderr
# pgbouncer_requests:
#       Junk printed to stderr
# postgres_autovacuum:
#       Non-zero exit during autoconf (255)
# postgres_bgwriter:
#       Non-zero exit during autoconf (255)
# postgres_cache_:
#       Non-zero exit during autoconf (255)
# postgres_checkpoints:
#       Non-zero exit during autoconf (255)
# postgres_connections_:
#       Non-zero exit during autoconf (255)
# postgres_connections_db:
#       Non-zero exit during autoconf (255)
# postgres_locks_:
#       Non-zero exit during autoconf (255)
# postgres_oldest_prepared_xact_:
#       Non-zero exit during autoconf (255)
# postgres_prepared_xacts_:
#       Non-zero exit during autoconf (255)
# postgres_querylength_:
#       Non-zero exit during autoconf (255)
# postgres_scans_:
#       Non-zero exit during autoconf (255)
# postgres_size_:
#       Non-zero exit during autoconf (255)
# postgres_transactions_:
#       Non-zero exit during autoconf (255)
# postgres_tuples_:
#       Non-zero exit during autoconf (255)
# postgres_users:
#       Non-zero exit during autoconf (255)
# postgres_xlog:
#       Non-zero exit during autoconf (255)
# proc:
#       In family 'auto' but doesn't have 'autoconf' capability
# slony_lag_:
#       Junk printed to stderr

Donc pour activer les affichage de Apache, il faut que mod_status soit activé, normalement c’est le cas. Il ne vous reste plus qu’à créer un lien symbolique linux dans le répertoire /etc/munin/plugins  vers un fichier du répertoire /usr/share/munin/plugins/

ln -s /usr/share/munin/plugins/apache_accesses apache_accesses
ln -s /usr/share/munin/plugins/apache_processes apache_processes
ln -s /usr/share/munin/plugins/apache_volume apache_volume

 

 

 

 

 

Linux ajouter un hôte connu au fichier known_hosts

Lorsque vous vous connectez pour la première fois sur un serveur en ssh, il peut vous arriver le message suivant : « WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED ».

En fait le client ne reconnait pas le site distant, qui n’est pas dans un fichier noté known_hosts, ce dernier se trouve dans le répertoire invisible .ssh.

Pour ajouter manuellement le site distant dans ce fichier, allez d’abord dans le site distant si vous avez accès (autrement veuillez contacter l’administrateur du site distant.) et tapez la commande :

$ ssh-keyscan -t rsa server_ip
# 115.22.8.17 SSH-2.0-OpenSSH_6.7p1 Debian-5+deb8u4
115.22.8.17 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAB....

Ouvrez le fichier known_hosts de votre client, et collez la chaine affichée commençant par « 115.22.8.17 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAB… »

Connectez vous à présent.

 

bit torrent linux

Transmission un client léger bitTorrent pour Linux

 

Installation de transmission

apt-get install transmission-cli
#je suppose que vous n'avez pas d'interface graphique, on fait tout en ligne de commande.

apt-get install transmission-daemon

 

 

Configuration du fichier settings.json

Le fichier de configuration se trouve dans /var/lib/transmission-daemon/info/

N’arrêtez pas votre démon Transmission, éditez le fichier json mais ne faites pas un redémarrage, car les données vont être écrasée, à la place, faites un reload :

service transmission-daemon reload

Les sections à configurer : la vistesse en upload et download, le répertoire des téléchargements incomplets et complets.

    "rpc-authentication-required": true, // Activer l'authentification par mot de passe
    "rpc-enabled": true,                 // On active l'interface, optionnel on fera l'impasse de l'interface web qui nécessite un virtual host Apache
    "rpc-password": "Password",          // Tapez votre mot de passe en clair, il sera chiffré à l'enregistrement
    "rpc-port": 9091,                    // Port d'accès à l'interface
    "rpc-url": "/transmission/",         // Url d'accès à l'interface
    "rpc-username": "Utilisateur",       // Le nom d'utilisateur pour l'authentification

#ici modifier le rpc-username/rpc-password par transmission/transmission, pour la suite c'est ce qui est supposé

Par la suite les commande se feront avec transmission-remote.

Commandes Transmission-remote

Pour ajouter un torrent : téléchargez ou uploadez un fichier avec extension torrent, modifier le nom pour le rendre plus court, perso je download sur Windows modifie le nom et uploade vers le serveur.

transmission-remote -n 'transmission:transmission' -a lefichier.torrent
localhost:9091/transmission/rpc/ responded: "success"

La paire ‘transmission:transmission’ correspond au login/mot de passe.

Si la réponse à la commande correspond à la seconde ligne, c’est réussi, faites immédiatement la commande suivante pour connaitre l’état du téléchargement. Si vous avez une erreur du type 401 ou Unexpected response: <h1>401: Unauthorized</h1>Unauthorized User: deflate, gzip , vérifiez que vous avez bien mis le username et le mot de passe du fichier json, c’est une des causes.

pour connaitre l’état de téléchargement

transmission-remote -n 'transmission:transmission' -st

Autres commandes :

Start all torrents:

    transmission-remote -s all  << transmission-remote -n transmission:transmission -s all

Stop all torrents:

    transmission-remote -S all

Start a specific torrent:

    transmission-remote -s [hash]

Stop a specific torrent:

    transmission-remote -S [hash]

Remove all torrents (-t désigne le torrent courant,all après -t spécifie tous les torrents):

    transmission-remote -t all -r  

Remove a specific torrent:

    transmission-remote -r [hash]

Get hashes for all torrents:

    transmission-remote -i

List all torrents with status:

    transmission-remote -l

Quit the daemon:

    transmission-remote -q

source des commandes.

Dans certaines commande ci-dessus, vous voyez un argument [hash], c’est le has sha1 du torrent. Mais comment voir ce hash? C’est avec la commande transmission-show nom-du-torrent.torrent que vous allez voir le hash.

Liens : Configuration fichier json

 

 

debian

SecurityException in Application.cpp:511: Unknown Interpreter Configuration de SuPHP 0.7 attention les guillemets !

Configuration de SuPHP 0.7 attention les guillemets !

 

J’ai reçu ce message dans les logs erreur d’apache du virtualhost concerné:

SecurityException in Application.cpp:511: Unknown Interpreter: php

D’après ce que j’ai lu, dans la version 0.7 de SuPHP il faut mettre les guillemets dans certaines directives:

[handlers]
;Handler for php-scripts
x-httpd-php="php:/usr/bin/php-cgi"

;Handler for CGI-scripts
x-suphp-cgi="execute:!self"

Car dans les versions précédentes (et pas mal de tuto sur le web, c’est affiché sans les guillemets.

 

https://blog.yacoubi.fr/?post/2009/10/16/suPHP-0.7.1-SecurityException-in-Application.cpp_511

dropbox

Utiliser Dropbox sur votre serveur dédié et sauvegarder vos dump

Sauvegardez vos archives serveur dédié dans Dropbox

 

Dropbox est une sauvegarde sur le cloud qui peut s’avérer économique et très fiables pour vos dumps de base de données.

J’ai une formule pour 1 Téra que je n’utilise pas entièrement (et ce pour 99€/an), donc si je pouvais créer un répertoire pour sauvegarder les archives serveur ce serait bien, mais à ces conditions suivantes :

-je ne dois pas voir ces sauvegardes sur mon ordinateur personnel

-Dropbox ne doit sauvegarder que les dumps sur le serveur dédié

On va voir comment on va créer un répertoire que j’appelle SAVDEDIE que je crée dans le répertoire /root, y mettre toutes les sauvegardes de base de données, et ne pas les voir sur mon ordinateur personnel.

Installer Dropbox sur le serveur dédié sous Linux

On va utiliser wget, il y a deux versions, la 32 et la 64bit, à vous de voir quelle est votre distribution Linux. Vous allez installer Dropbox dans votre répertoire /root, l’utilisateur root normalement n’a pas de quota, si c’est le cas, veuillez à lui donner un quota infini dans votre panel de gestion de dédié (pour mois c’est Webmin).

Ouvrez une session ssh avec Putty. Copiez ces commandes dans le presse papier et allez dans Putty puis clic droit de la souris, cela va coller la commande.

wget -O dropbox.tar.gz "http://www.dropbox.com/download/?plat=lnx.x86_64"

ou

wget -O dropbox.tar.gz "http://www.dropbox.com/download/?plat=lnx.x86"


puis faites la décompression

tar -xvzf dropbox.tar.gz

Démarrez le démon Dropbox

~/.dropbox-dist/dropboxd

Le caractère tilde ~ signifie aller au répertoire home de l’utilisateur courant, dans notre cas, on est en root (c’est obligatoire pour installer Dropbox), donc on va au répertoire /root.

Après avoir lancé le démon, vous allez avoir un message qui tourne en boucle régulièrement

This client is not linked to any account... Please visit https://www.dropbox.com/cli_link?host_id=7d44a557aa58f285f2da0x67334d02c1 to link this machine.

Activer le compte en copiant un lien sur votre navigateur

Linux n’ayant pas d’interface graphique, il vous faut vous authentifier votre installation Dropbox via votre navigateur

Surlignez avec la souris le lien https://www.dropbox.com….  ça va le copier dans le presse-papier. Ensuite ouvrez un navigateur et collez y l’url. Vous devrez vous authentifier sur votre navigateur, si c’est ok l’opération de liaison de votre serveur Linux et de votre compte Dropbox à réussis, Dropbox va créer un répertoire Dropbox et commencer à synchroniser les fichiers.

 

 

Installer l’outil en python en ligne de commande

Pour faire ce que vous faites avec Dropbox sur votre ordinateur avec interface graphique, (créer des répertoires, exclure des répertoire de la synchronisation) il ya un outil en ligne de commande officiel fait par Dropbox à télécharger et installer.

$ mkdir -p ~/bin  
$ wget -O ~/bin/dropbox.py "http://www.dropbox.com/download?dl=packages/dropbox.py"  
$ chmod 755 ~/bin/dropbox.py  
$ ~/bin/dropbox.py help

 

Muni de cet outil CLi (ligne de commande) vous pouvez exclure les répertoires que vous ne voulez pas voir sur votre dédié comme vos photos de vacance, on va se limiter au strict nécessaire, les sauvegardes de base de données.

Tout d’abord utilisez l’outil CLi pour voir le status de Dropbox

$~/bin/dropbox.py start

$~/bin/dropbox.py status

Vous vous apercevez que le processus de synchronisation a déjà commencé, il faut donc exclure les répertoires et les fichiers

$~/bin/dropbox.py exclude add fichier1 fichier2 fichier3

pour exclure un répertoire

$~/bin/dropbox.py exclude add folder1 folder2

pour les noms avec espace comme photos vacances

$~/bin/dropbox.py exclude add photos\ vacances

le slash sert à échapper les caractères spéciaux

Une fois que vous avez exclu des répertoire, vérifiez ce qui a été exclu

$~/bin/dropbox.py exclude list

 

Créer un répertoire pour la sauvegarde et ne l’excluez pas de la sauvegarde !

Il se peut que au bout d’un certain temps la synchronisation ne marche plus, en effet il m’est arrivé qu’au bout d’environ 35000 fichiers, la synchronisation soit stoppée. La raison est que le programme Dropbox par défaut ne peut gérer qu’un certains nombre de fichiers, il faut lever cette limite,d’ailleurs vous aurez un message de ce type si vous tentez de redémarrer Dropbox en faisant stop et start.

Unable to monitor entire Dropbox folder hierarchy. Please run "echo fs.inotify.max_user_watches=100000 | sudo tee -a /etc/sysctl.conf; sudo sysctl -p" and restart Dropbox to fix the problem.

Il suffit de faire la commande préconisée

echo fs.inotify.max_user_watches=100000 | sudo tee -a /etc/sysctl.conf; sudo sysctl -p

Et ensuite redémarrez Dropbox.

Voilà j’espère que vous apprécierez cette astuce pour avoir des sauvegarde fiables de vos données sur vos serveurs web sans débourser un centimes de plus si vous avez déjà Dropbox. En effet on peut considérer que c’est gratuit puisque de toute façon vous avez déjà un compte Dropbox. Inutile de pense à du C14 ou du Amazon Glacier, ces solution peuvent paraitre pas cher mais vous êtes facturé à la bande passante. De plus ce sont des sauvegarde-sauvegarde, vous êtes sensé les utiliser comme recours lorsque vous perdez des données, avec Dropbox, ce sont des données vivantes que vouspouvez sauvegarder, comme des banques d’images, des répertoires entier.

Pour aller plus loin, je me suis inspiré de ces deux liens pour faire ce que je vous ai décris dans ce billet :

http://www.dropboxwiki.com/tips-and-tricks/install-dropbox-in-an-entirely-text-based-linux-environment

http://www.dropboxwiki.com/tips-and-tricks/using-the-official-dropbox-command-line-interface-cli

Retour en haut