Introduction
Donne une commande unix à un développeur, il corrigera son problème. Apprend lui à utiliser l’essentiel, tu diviseras par deux ton support niveau 1.
Vous aurez probablement reconnus la sagesse originale : “Donne un poisson à un homme il aura a manger un jour, apprends lui à pêcher, il aura à manger toute sa vie”.
Eh bien je pense que pour les commandes unix de base, c’est pareil. En plus bash et ses copains peuvent vous faire gagner un temps incroyable sur certains traitements. Le but de cet article est donc de présenter quelques commandes très utiles, quelques petits outils et des exemples pragmatiques réutilisables ou adaptables facilement.
Je ne pense pas faire de vous des administrateurs (car ce n’est pas votre but) mais seulement vous faire gagner du temps. Tous les développeurs n’ont pas forcément une affinité naturelle avec unix mais tous seront d’accord pour gagner du temps en général.
Vos futurs meilleurs amis
Il n’y a pas de règle, certain vous diront qu’il faut au moins 15 tools pour survivre, d’autres ne travail qu’avec deux. Le principe que je défends de mon coté c’est : allons au plus vite et au plus efficace.
Voyons donc quelques amis : less, cat, cut, grep, find, sort, uniq, tar, chmod et chown
PS : on en reparlera plus loin mais le symbole pipe (|), la double barre verticale située sur Alt_GR + 6, permet de chainer la sortie d’une commande à l’entrée d’une autre.
PS2 : ces commandes ont presque toutes des options, des “switchs”, vous pouvez les voir en tapant –help après leur nom.
PS3 : Titi, tata, toto et tutu son des fichiers ou mots inventés, toute ressemblance avec une variable ou un fichier réel ne serait que le fruit du hasard.
PS4 : Aucun électron n’a été blessé ou tué lors du tournage de ce mini howto.
PS5 : Sous Debian, si vous ne les avez pas, tapez “apt-get install nom_commande” et vous l’aurez. Si ce n’est pas directement ce nom, “apt-cache search nom_commande” et aptitude vous affichera ce qu’il a de proche.
Less
Comme dit notre directeur technique “less can more”. Comprendre que la commande less fait tout ce que fait la commande more, en mieux et bien plus. Less vous permet d’afficher un contenu ligne par ligne, page par page et même de chercher dans cet affichage.
Exemples d’usage de less
less toto.txt <- affiche le contenu de toto.txt
less toto.txt <- pendant l’affichage, si j’appuye sur page down il passe une page vers le bas, flèche up une ligne vers le haut et si je tape sur la touche slash (/) il me permet de rechercher un terme.
Cat
Cette commande est, approximativement, équivalente à « type » sous Dos/win.
Elle affiche le contenu du fichier qui lui est passé en argument et peut le rediriger. Elle peut faire de nombreuses autres choses mais nous utiliserons seulement la base ici. (zcat, c’est comme cat mais pour des fichiers compressés avec gzip. zcat readme.gz)
Exemples d’usage de cat
cat toto.txt <- affiche le contenu de toto.txt (sans possibilité de le faire page par page)
cat toto.txt > titi.txt <- copy le contenu de toto.txt dans titi.txt (si titi existe, il est écrasé) cat toto.txt >> titi.txt <- ajoute le contenu de toto.txt à la fin (>>) de celui de titi.txt
cat > toto.txt <- (re)Crée toto.txt et écrit ce que vous tapez, tapez CTRL+D pour arrêter
cat >>toto.txt <- écrit à la fin toto.txt ce que vous tapez, tapez CTRL+D pour arrêter
cut
cut est un de vos meilleurs amis. Si vous avez une ligne qui contient plusieurs éléments, vous pouvez affichez ceux que vous voulez.
Exemples d’usage de cat
Admettons que toto.txt comporte les lignes suivantes :
test 1 john 12:00 ok
test 2 henry 14:00 nok
si vous faite : cat toto.txt | cut -f1 -d ” ”
vous allez avoir le résultat :
test
test
car cut aura pris le premier champs (-f1) en admettant que le séparateur est espace (-d ” “)
Donc si on tape :
cat toto.txt | cut -f 2,4,3 – d ” ”
On obtiendra :
1 12:00 john
2 14:00 henry
on a réorganisé et sélectionné les champs que l’on voulait (-f 2,4,3). Autant dire que pour traiter du CSV, c’est juste du bonheur !
Grep
c’est un outil sympa qui permet de filtrer. Soit on lui demande ce que l’on veut voir, soit on lui demande d’enlever ce que l’on ne veut pas voir.
Exemple d’usages de grep
Si je tape : grep titi toto.txt, il va m’afficher les occurrences du mot titi dans le contenu du fichier toto.txt
si je fais grep -r titi toto.txt, il m’affichera tout ce qui ne contient pas titi dans le fichier toto.txt.
Grep travail ligne à ligne ce qui permet de faire disparaitre toutes les lignes qui comporterait titi et d’afficher toutes les autres. Bien sûr on peut chainer les grep :
cat toto.txt | grep titi | grep -v tata | grep -v tutu
Cette commande affichera toutes les lignes de toto.txt qui contienne titi mais pas tata ou tutu. Si on ajoute le switch -r ca devient une commande récursive (qui ira dans les sous directory), par exemple : grep -r tutu *.txt cherchera dans tous les fichiers .txt de tous les sous répertoires l’expression tutu. On peut aussi utiliser -i pour qu’il ne soit pas sensible à la casse (majuscule/minuscule) et qu’il considère que TUTU et Tutu sont les mêmes choses.
sort et uniq
Deux commandes simples qui permettent pour la première de trier (par ordre alphabétique par défaut) et la seconde de dédoublonner (sur exact match par défaut). Vous pouvez améliorer leur efficacité ou les spécialisées pour vos besoins avec des options. (sort –help et uniq –help pour les voir)
find
find c’est l’équivalent du petit chien sous windows qui va chercher vos fichiers
En plus teigneux. On a même un projet secret à NBS System de refaire un find avec une animation en ncurses pour refaire le petit chien de Windows
Exemple de commande find
En gros la commande est très utile mais sa syntaxe “exotique”. Si vous voulez trouver un fichier :
find . -name toto.txt vous trouvera tous les fichiers toto.txt, dans tous les sous répertoires du répertoire courant.
Si vous voulez leur appliquer une commande à cette liste de fichiers trouvés, vous pouvez utiliser le switch -exec : find /var/www/ -name “*.asp” -exec rm {} ;
Cela recherchera tous les fichiers asp dans le répertoire /var/www et les effacera, c’est le rôle de « -exec rm {} ; » Légitime défense
Bon bref, vos pouvez remplacer rm par cat, echo ou un autre de ses potes mais le fait d’appliquer la commande à la collection d’objet trouver se matérialise par {} ;
Tar
Tar, c’est l’anti connerie. On fait toujours un backup avant de faire quoique ce soit, tar permet de faire et défaire une archive. A l’origine il écrivait aussi sur des bandes mais on ne se sert que rarement de ce point. Vous aurez besoin de « tarer » (faire l’archive) et « détarer » (défaire l’archive). Au passage on en profite pour zipper avec le switch « z ».
Exemple d’usage de tar
tar -tf archive.tgz <- liste le contenu
tar -zcvf archive.tgz /var/www <- archive le répertoire /var/www
tar -zxvf archive.tgz /var/www <- extrait l’archive archive.tgz vers /var/www
En général tgz veut dire .tar.gz.
On peut aussi lier les commandes avec des pipes (prononcer païpe)
cat toto.txt | tar -cvf toto.tar –
Attention, tar est une des rares commandes Unix qui ait une syntaxe inversée destination / source au lieu du source/destination habituel.
chmod & chown : les droits
Souvent, la solution d’un problème consiste à changer les fameurs droits. Deux outils permettent de le faire, chown permet de changer le propriétaire et chmod les droits du propriétaire, de son groupe et de tout le monde.
Les synthaxes sont simples. Chown prend deux paramètres séparés par un point qui sont le nom du propriétaire et le nom du groupe.
chown www-data.www-data index.php donnera la propriété du fichier au compte utilisateur www-data (généralement celui d’apache sur Linux / debian) et attribuera églement www-data comme groupe au fichier.
Du coté de chez chmod, il y a une tripotée de paramètres mais les plus classiques sont :
755 : trois group de chiffres qui sont l’addition de 1, 2 et 4
donc 7 = 1+2+4 qui correspond à 1= executer, 2 = écrire, 4 = lire.
Le premier chiffre représente les droits du propriétaire du fichier, le second du groupe et le troisième de tout le monde. mettre un ficher en 700 donne tout les droits à son propriétaire (et à root) mais aucun à personne d’autre, en 777 donne tous les droits à tout le monde et en 755 la lecture/écriture/éxecution à son propriétaire et juste lecture/execution aux autres. (755 c’est généralement pas mal pour le web).
-R rend ces commandes récursives.
Bash
Bash est un surdoué, un shell plein de ressources.
De façon native (built-in on dit), bash sait faire beaucoup de choses sympas. Si on lui adjoint des commandes efficaces, on arrive à un traitement d’une puissance très honorable !
La base
CTRL+A : aller au début de la ligne
CTRL+R : retrouver une commande que vous avez tapez avant en tapant quelques lettres
CTRL+E : aller à la fin de la ligne
export a=2 <- crée la variable $a et lui assigne la valeur 2
Les combos
Pour faire des choses amusantes, il nous faut utiliser des “pipes”. (prononcer païpes)
Les symboles > < et | ont une signification particulière pour Bash. Ce sont des objets permettant de rediriger des flux, de lier des commandes entres elles. On a vaguement vu la chose avec la commande cat > pour créer et cat >> pour “appender”.
cat toto.txt | less
ca envoie le contenu de toto.txt à la commande less qui elle va l’afficher page par page. En l’occurrence aucun intéret puisque faire directement less toto.txt fera la même chose en moins de texte.
Par contre ca :
cat toto.txt | sort | uniq | less
C’est intéressant, car on liste le contenu du fichier toto.txt, on en envoie le résultat à la commande sort qui va trier par ordre alphabétique, ensuite ce résultat trié va vers la commande uniq qui dédoublonne le résultat et enfin vers la commande less qui affiche le résultat page par page. Tout ca en une ligne.
On aurait d’ailleurs pu finir cette chaine de flux par un > pour l’écrire dans un fichier :
cat toto.txt | sort | uniq > toto_trié_et_dédoublonné.txt
la plupart du temps | sert à chainer les commandes et > a écrire dans un fichier (ou à la fin de celui-ci avec >>).
Allons-y un peu plus franchement. Admettons qu’un fichier liste.txt contienne plein de prénoms les uns à la suite des autres en vrac, même pas un par ligne, juste séparés par des espaces et que l’on veuille les trier dans l’ordre alphabétique.
Une petite boucle bash :
export a=`cat liste.txt`
for i in $a; do echo $i | sort >liste_triée.txt; done
On insère le résultat de la commande “cat liste.txt” dans la variable a. Ensuite on fait une boucle sur un compteur i au sein de la variable a, on affiche le résultat et ensuite on trie et on insère dans le fichier.
Parfois le séparateur n’est pas pratique et un utilitaire très puissant, appelé AWK, peut vous aider. La synthaxe est complexe mais le résultat est sympa, voici un exemple :
awk -F : ‘{print $1 ” ” $4}’ /etc/passwd
ca considère “:” comme le séparateur et ca affiche $1 (le premier item) puis un espace ” ” puis $4 (le 4° item selon le séparateur “:”.
Créer un script bash
Le “shebang”, pour sh bang, lancer un shell. C’est comme cela qu’on appel le fait de lancer Bash, tout script bash commence par :
#!/bin/bash
Ensuite on insère son traitement, si on veut prendre en compte les paramètres de la ligne de commande,
$0 = nom du script, $1 = 1° paramètre, $2 = 2° paramètres etc…
# !/bin/bash
PATH=/usr/local/bin;/bin;/sbin;/usr/local/sbin;/usr/bin
echo $0 est lancé avec les paramètres $1 et $2
case “$1″ in
start)
echo starting
;;
case “$1″ in
stop)
echo stopping
;;
case “$1″ in
*)
echo rien à faire je ne comprends que start ou stop
;;
Evidemment, là ca manque d’intérêt, il faut lui faire faire des vraies choses au script mais bon, c’est un squelette qui fonctionne, à vous de le peupler.
Faire démarrer un script au moment du boot et le couper à son arrêt
Le placer dans /etc/init.d et ensuite faire un lien dans /etc/rc3.d et un autre dans /etc/rc6.d :
cp script.sh /etc/init.d
ln -s /etc/init.d/script.sh /etc/rc3.d/S99_myscript
ln -s /etc/init.d/script.sh /etc/rc3.d/K99_myscript
si vous avez le case avec les start et stop dans le script, le système lancera automatiquement le start tout à la fin du boot et stoppera juste au redémarrage.
Il y aura peut être une V2 de cet article avec les plannification de taches et quelques autres exemples mais pour le moment, je vais partir en vacances un peu, Bargento 2, ca m’a fatigué alors on se revoit dans une semaine !
Peu après mon retour, je vous publierai le 2/3 de construire son infrastructure Magento : Le serveur Web
avril 27th, 2010 at 16 h 21 min
[...] Cet accès peut avoir plusieurs niveaux, utilisateurs et administrateurs par exemple. Avoir un accès Shell donne accès aux outils d’administration Unix qui sont très puissants et permettent de gagner du temps, quelques posts ont été fait sur ce blog à ce sujet, notamment ici. [...]