Linux

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

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

Linux

Convertir l’encodage d’un fichier en ligne de commande sous Linux

Je sais que nombre d’entre vous avez rencontrés d’énorme difficulté avec les page web qui ne s’affichent pas bien,on n’est pas gâté en France avec autant de lettres accentuées ! Et quand on a trouvé la formule qui affiche correctement, on ne touche plus à rien !

En attendant je vous donne une technique qui permet de convertir en ligne de commande sous Linux (oui oui), avec iconv (ça vous dit rien cette fonction sous php?)

iconv -f ISO-8859-1 -t UTF-8 nom_du_fichier_source -o fichier_encode

Pour l’occasion on a créé un autre fichier, histoire de garder une trace de l’ancien fichier au cas où.

Memento Linux

Forcer à utililser un user

Pafois la commande su nom_du_user ne marche pas vous avez le message « This account is currently not available. », regardez dans le fichier /etc/passwd, souvent ce user est posté à nologin, ce qui veut dire que vous ne pouvez pas vous logger en son nom.

apache:x:48:48:Apache:/var/www:/sbin/nologin
changer en 
apache:x:48:48:Apache:/var/www:/sbin/bash

La seconde méthode est de forcer temporairement le login:

su -l apache -s /bin/bash

vv

Liste les utilisateurs :

cut -d: -f1 /etc/passwd

dd

Installer virtualmin sur Debian

D’abord connectez vous n root vis SSH (avec Putty par exemple)

Ensuite en ligne de commande tapez la commande suivante :

wget http://software.virtualmin.com/gpl/scripts/install.sh

ensuite exécutez ce script shell :

sh install.sh et le processus se lance automatiquement, avant de démarrer l’installation, il va lister une série d’OS, le votre doit y figurer sinon l’installation se plante.

SSH temps connexion long après mot de passe

Voilà un problème que j’ai eu  récemment que j’ai résolu en cherchant sur le net.

Lorsque je me connecte via SSH à mon dédié, après que le mot de passe soit entré, le temps d’attente peut être très long une minute ou plus pour accéder au shell.

J’ai jusque là contourné le problème en ouvrant une seconde fenêtre et en me connectant au même compte et fermer la première pour aller plus vite.

 

En fait il s’avère que le problème soit dû à un lookup DNs un peu long. Pour remédier à ce problème, il faut ajouter une directive dans le fichier de configuration du SSH.

 

Il faut ajouter cette ligne ou la décommenter :

UseDNS no

là votre connexion devrait être beaucoup plus rapide.

Linux

Introduction à l’utilisation de AWK

AWK est un programme qui permet de manipuler les lignes dans un fichier texte, dès qu’on parle AWK, on est dans le monde Linux.

Quand est ce que AWK est utile?

En général, lorsque vous devez transporter des données d’une système à un autre, par exemple, vous devez extraire des références d’une base sous SQL Server en environnement Windows, que vous devez comparer avec une base de données sous Mysql dans Linux. En gros lorsque vous n’avez aucune possibilité d’avoir un outil ou un programme pour le faire, alors AWK est votre sauveur, car il est puissant et permet de traiter de très gros fichiers, de façon très libre, donc vous pouvez avoir des possibilités très grandes.

Exemple 1 : simple réutilisation des données sans altération avec Awk

imaginons que vous ayez un  fichier texte « text.txt » avec des noms et prénoms

Dupont Jean
Guynemer Marie
Dubois Robin

Nous allons utiliser Awk pour inverser le nom et le prénom :

awk '{print $2 $1}' test.txt
Jean Dupont
Marie Guynemer
Robin Dubois

Par défaut le séparateur de mot est le caractère espace.

Exemple 2 : Ajout d’une chaine de caractères aux champs existants

awk '{print "Bonjour " $2 " " $1}' test 
Bonjour Jean Dupont
Bonjour Marie Guynemer
Bonjour Robin Dubois

 

Exemple 3 : ajouter la syntaxe de requêtes SQL à une liste de référence

soit la liste de références :

AVR-11

DFV-6

BdD7a

notre fichier est une liste de mots même pas séparés par une virgules, nous devons transformer chaque ligne en requête SQL

INSERT INTO MATABLE (reference) VALUES ('AVR-11')

Syntaxe générale de AWK

Elle est la suivante :

awk [ -F fs ] fichier

awk prend entrée un fichier, mais ne vas modifier le fichier, vous devez générer un nouveau avec les lignes modifiée en utilisant le caractère ‘>’ qui redirige la sortir vers un fichier texte.

Le paramètre F permet d’indiquer un séparateur custom.

Exemple 4 : Construction d’une requête SQL avec caractères spéciaux

Les caractères spéciaux sont les apostrophes, en effet comme d’habitude lorsqu’on met des caractères. test est le nom du fichier contenant les données en csv

Ceci ne marchera pas
awk '{print "INSERT INTO FROM SAGE (ref) VALUES ('$1')"}' test


INSERT INTO MATABLE (nom) VALUES ('Dupont')

Ceci marche:
awk '{print "INSERT INTO FROM SAGE (ref) VALUES (\x27"$1 "\x27)\x3B"}' test

on a en sortie :
INSERT INTO MATABLE (nom) VALUES ('Dupont')

Si on veut ajouter des valeurs en dur il faut mettre entre parenthèses :

awk '{print "INSERT INTO FROM SAGE (ref) VALUES (\x27"$1 "\x27,\x27"valeur en dur"\x27)\x3B"}' test

INSERT INTO MATABLE (nom) VALUES ('Dupont', 'valeur en dur')

Variante avec printf: 

awk '{printf "INSERT INTO FROM SAGE (ref) VALUES (\x27%S\x27,\x27%s\x27)\x3B",$1,"valeur en dur"}' test

Pour du multiligne

awk '{printf "INSERT INTO FROM SAGE (ref) VALUES (\x27%S\x27,\x27%s\x27)\x3B",$1,"valeur en dur";print ""}' test

\x27 est la version hexadécimale du caractère apostrophe. Voici une liste pour votre référence.

Autres exemples

Convertir en fichier CSV

"andros.kim@gmail.com"	"KISS"	"ANDROS"		"Bordeaux"
"jen202@gmail.com"	"GROS"	"JENNIFER"		"Nantes"
$ awk '{print $1 "," $2 "," $3 "," $4}' test

"andros.kim@gmail.com","KISS","ANDROS","Bordeaux"
"jen202@gmail.com","GROS","JENNIFER","Nantes"

Supplément pour enlever les guillemets :

#general pattern : sed 's/find/replace/' file
# le modificateur g (greedy) est nécessaire pour tout enlever
$ sed 's/"//g' test2
andros.kim@gmail.com,KISS,ANDROS,Bordeaux
jen202@gmail.com,GROS,JENNIFER,Nantes
docker

Introduction à Docker

Si vous êtes développeur et que vous n’avez pas encore entendu parler de Docker, vous devez vivre dans une caverne.

Docker est un système de conteneur léger d’application à la différence des machines virtuelles.

Ce qui veut dire que sur votre ordinateur, il n’y a qu’un seul OS, mais plusieurs containers Docker.

Mais trève de bavardage, nous allons voir comment installer Docker et mettre en place des containers Docker. La promesse étant de vous épargner d’installer une base, un logiciel, et toutes les dépendances, avec ceci tout est contenu dans un Docker, et quand vous l’installez, tout est mis à disposition.

 

Docker est disponible sur Windows, Mac mais c’est surtout sur Linux que vous aurez la meilleure expérience, en effet Docker se base sur un concept né du monde Unix (LXC).

Les différents composants de Docker:

Docker Engine

C’est le coeur de Docker, avec lui vous faites marcher une image (une représentation statique d’un conteneur), l’image en marche est en fait le conteneur. C’est un instantané d’un conteneur. C’est aussi dans cet état d’image que le conteneur va transiter entre le dépôt Docker et votre poste.

 

Docker Compose

C’est un peu la killer feature de Docker, c’est un programme qui vous permet de lier plusieurs container, par exemple vous avez un conteneur Apche, un conteneur MySQL, un conteneur PHP, Docker Compose vous permet à la manière d’un jeu de Lego de mettre en relation tout ce beau monde et de faire fonctionner comme si vous aviez installé chaque programme sur votre ordinateur.

 

La première chose est d’installer Docker !

Sur Linux, on va choisir une distro Debian, attention, les développeurs de Docker n’ont pas d’état d’âme et n’hésitent pas à casser une compatibilité avec une ancienne version pour faire marcher leur fonctionnalités dernier cri. De fait, vous aurez besoin d’un version 64 bits et assez récente de Debian, selon leur site, Debian 8 Jessie est recommandé, sinon avec la 7 il vous faudra faire une manipulation assez compliquée qui permet d’installer les dernière modification et ainsi « émuler une version Debian plus récente »

 

Préparation  de l’installation de Docker

  1. Permettre à Docker de commmuniquer via SSL
  2. Installer une clé de chiffrement GPG (alternative à OpenSSL)
  3. Mettre à jour le fichier des dépôts Debian /etc/sources.list

 

 Installation proprement dite de Docker Engine:

 

$ sudo apt-get update

$ sudo apt-get -y install docker-engine

 

Faire marcher pour la première fois Docker Engine avec un Hello World

Retour en haut