lundi 2 février 2015

Advanced bash commands : tee, at, cron, xargs, chroot, history ...

La commande xargs

La commande xargs permet d'appeler une autre commande, en passant en paramètre les données qu'elle reçoit dans le flux d'entrée standard. Sa syntaxe est la suivante : xargs commande : commande est la commande que xargs doit exécuter. xargs construira une ligne de commande complète pour cette commande, en utilisant comme paramètres les données issues du flux d'entrée standard. Une fois cette ligne de commande construite, xargs l'exécutera. Par exemple, la commande suivante :  
ls –l
Peut être exécutée également de la manière suivante :
xargs ls
et en tapant la chaîne de caractères « -l » suivie du caractère de fin de fichier CTRL+D :

mtoure@larbo:~/commandTest$ xargs ls
-l
total 8
drwxrwxr-x 2 mtoure mtoure 4096 janv. 28 00:02 MyProject
-rw------- 1 mtoure mtoure  109 janv. 28 00:04 nohup.out
mtoure@larbo:~/commandTest$

La commande xargs est une commande extrêmement utile lorsqu'elle est utilisée conjointement avec les pipes, parce qu'elle permet d'utiliser le résultat d'une commande en tant que paramètre pour une autre commande. Ce mécanisme est donc complémentaire de celui des pipes, puisque ceux-ci permettaient d'utiliser le résultat d'une commande pour alimenter le flux d'entrée standard d'une autre commande.
Un exemple pour clarifier les choses : Supposons que l'on désire trouver tous les fichiers d'une arborescence complète dont l'extension est .xml et contenant la chaîne de caractères « gao ». La liste des fichiers de l'arborescence peut être déterminée simplement à l'aide de la commande find, et la recherche du texte dans les fichiers se fait naturellement à l'aide de la commande grep. On utilisera xargs pour construire la ligne de commande pour grep, à partir du résultat fourni par la commande find :
mtoure@larbo:~/commandTest$ ls
fichier-autre-contenant-pas-mot-gao.xml  MyProject
fichier-contenant-mot-gao.xml            nohup.out
fichier-contenant-pas-mot-gao.xml
mtoure@larbo:~/commandTest$ find . -name "*.xml" | xargs grep -l "gao"
./fichier-contenant-mot-gao.xml
./fichier-autre-contenant-pas-mot-gao.xml
mtoure@larbo:~/commandTest$

La variable CDPATH

Parmi les variables d'environnement utiles, on oublie CDPATH. Elle permet d'offrir des chemins directement accessibles via « cd ». Comme pour $PATH, les chemins sont concaténés avec ':'  En effet, par défaut, cd nomRepertoire recherche le répertoire nomRepertoire dans le répertoire courant, mais en spécifiant la variable CDPATH, il est possible de demander au shell de regarder éventuellement dans d‘autres répertoires si ce répertoire existe. Un petit exemple pour clarifier les choses :
mtoure@larbo:~$ cd MyProject
bash: cd: MyProject: Aucun fichier ou dossier de ce type
mtoure@larbo:~$ export CDPATH=.:~/commandTest
mtoure@larbo:~$ cd MyProject
/home/mtoure/commandTest/MyProject
mtoure@larbo:~/commandTest/MyProject$ 

Simplifions le déplacement avec : cd -  

cd - permet de retourner au répertoire précédent. Un exemple simple :

mtoure@larbo:~/commandTest$ pwd
/home/mtoure/commandTest
mtoure@larbo:~/commandTest$ cd test/
mtoure@larbo:~/commandTest/test$ pwd
/home/mtoure/commandTest/test
mtoure@larbo:~/commandTest/test$ cd -
/home/mtoure/commandTest
mtoure@larbo:~/commandTest$ pwd
/home/mtoure/commandTest
mtoure@larbo:~/commandTest$ 

Correction automatique avec l'option shopt -s cdspell

Une option permet de demander à bash de corriger les (petites) fautes frappes simples lors de l‘utilisation de la commande cd. Il suffit d'ajouter  : echo "shopt -s cdspell" >> ~/.bashrc  dans votre  ~/.bashrc :
mtoure@larbo:~/commandTest$ ls
MyProject
mtoure@larbo:~/commandTest$ cd MyProjet
bash: cd: MyProjet: Aucun fichier ou dossier de ce type
mtoure@larbo:~/commandTest$ source ~/.bashrc
mtoure@larbo:~/commandTest$ cd MyProjet
MyProject
mtoure@larbo:~/commandTest/MyProject$ 

Retrouver l'historique de vos commandes 

Les commandes exécutées sont enregistrées dans un historique. La variable d'environnement HISTSIZE, vous permet de limiter le nombre maximal des commandes à enregistrer. Vous pouvez accéder à l'historique avec la commande history. L'option permet d'afficher les n dernières commandes. Si vous tapez !n puis entrez, la commande identifiée par le numéro n est automatiquement exécutée. Le raccourci Ctrl + R permet d'effectuer une recherche dans l'historique des commandes :
mtoure@larbo:~/commandTest$ ls
text  uniq-test.txt
mtoure@larbo:~/commandTest$ ps -ef | grep scala
mtoure    8921  3486  0 23:00 pts/3    00:00:00 grep --color=auto scala
mtoure@larbo:~/commandTest$ ls -l
total 8
-rw-rw-r-- 1 mtoure mtoure  31 janv. 27 22:59 text
-rw-rw-r-- 1 mtoure mtoure 194 janv. 27 22:03 uniq-test.txt
mtoure@larbo:~/commandTest$ history 3
  205  ps -ef | grep scala
  206  ls -l
  207  history 3
mtoure@larbo:~/commandTest$ !205
ps -ef | grep scala
mtoure    8928  3486  0 23:00 pts/3    00:00:00 grep --color=auto scala
mtoure@larbo:~/commandTest$ 

Pour finir :
  •  !String : re-exécute la dernière commande de l'historique qui commence par la chaîne : String
  •  !?String : re-exécute la dernière commande de l'historique contenant la chaîne : String 

Trois méthodes pour (re)exécuter vos commandes 

  •   La combinaison : Ctrl + P puis Entrer
  •   Juste en tapant : !! puis Entrer
  •  ou tout simplement : !-1 puis Entrer
mtoure@larbo:~/commandTest$ ls -l
total 8
-rw-rw-r-- 1 mtoure mtoure  31 janv. 27 22:59 text
-rw-rw-r-- 1 mtoure mtoure 194 janv. 27 22:03 uniq-test.txt
mtoure@larbo:~/commandTest$ !!
ls -l
total 8
-rw-rw-r-- 1 mtoure mtoure  31 janv. 27 22:59 text
-rw-rw-r-- 1 mtoure mtoure 194 janv. 27 22:03 uniq-test.txt
mtoure@larbo:~/commandTest$ ls -l
total 8
-rw-rw-r-- 1 mtoure mtoure  31 janv. 27 22:59 text
-rw-rw-r-- 1 mtoure mtoure 194 janv. 27 22:03 uniq-test.txt
mtoure@larbo:~/commandTest$ !-1
ls -l
total 8
-rw-rw-r-- 1 mtoure mtoure  31 janv. 27 22:59 text
-rw-rw-r-- 1 mtoure mtoure 194 janv. 27 22:03 uniq-test.txt
mtoure@larbo:~/commandTest$ 

Clean Console :

Soit vous utilisez la commande clear bien utile de temps à autre pour y voir plus clair ou tout simplement le raccourci clavier : Ctrl + L ...

Commande nohup :

Cette petite commande permet de lancer un programme et le maintenir même une fois la console fermée. A chaque utilisation, la commande nohup crée un fichier de log nommé nohup.out, permettant de consulter les messages qui auraient dû s'afficher sur la console. 


mtoure@larbo:~/commandTest/MyProject$ nohup gedit test-fichier-reste-ouvert-meme-apres-fermeture-console.txt
nohup: les entrées sont ignorées et la sortie est ajoutée à «nohup.out»
mtoure@larbo:~/commandTest/MyProject$ 

Commande tee : une pour deux

La commande tee est un petit programme permettant d'enregistrer les données qu'il reçoit dans son flux d'entrée standard dans un fichier et de les renvoyer simultanément vers son flux de sortie standard. Elle est utilisée en conjonction avec un ' |. Cela est utile dans le cas où des messages d'erreur défilent sur l'écran trop vite pour que vous puissiez les lire. Cela permet d'avoir à la fois le résultat à l'écran et dans un fichier : commande | tee [options] fichier Principales options : -a Ajoute à la fin de "fichier" si celui-ci existe déjà
La commande : tee fichier écrit directement dans le fichier ce que l'on tape au clavier. 
mtoure@larbo:~/commandTest$ tee test-commande-tee.sh
ls -l                  
ls -l
une ligne qui sera ajoutée au fichier test-commande-tee.sh
une ligne qui sera ajoutée au fichier test-commande-tee.sh
^C
mtoure@larbo:~/commandTest$ cat test-commande-tee.sh 
ls -l
une ligne qui sera ajoutée au fichier test-commande-tee.sh
mtoure@larbo:~/commandTest$
Vous remarquez que la ligne tapée est affichée et écrite dans le fichier test-commande-tee.sh passé en paramètre de la commande teeLa commande tee peut être utile dans les scripts A partir du fichier /var/log/apache2/access.log, récupérer les lignes datant du 19/05/2012 en les affichant à l'écran et en les enregistrant dans un fichier :
mtoure@larbo:~/commandTest$ grep 'gao' test-commande-tee.log | tee tee-gao.log
La ligne 1 contenant le mot clé gao
La lgne 3 contenant le mot clé gao
mtoure@larbo:~/commandTest$ cat tee-gao.log 
La ligne 1 contenant le mot clé gao
La lgne 3 contenant le mot clé gao
mtoure@larbo:~/commandTest$ 

Chroot : Changement manuel de racine (/) d’un système de fichier

Un problème récurrent pour un utilisateur Linux : le secteur d’amorçage est détruit ou endommagé ; le menu de Grub est effacé ou incorrect ; le chargement du système affiche une erreur lors du démarrage. Prenons l’exemple typique qui peut arriver à tout le monde ! Imaginons qu'on arrive plus à booter sur système. Par exemple un problème de Grub corrompu. Une solution est de pouvoir lancer la commande update-grub afin de réparer le Grub corrompu (remplacement du fichier incorrect). Cela est impossible vu qu’il est impossible de démarrer le système. L’idéal est de pouvoir utiliser un autre système qui se charge de réparer les fichiers corrompus du système inactif. Autrement dit comment arriver à lancer cette commande comme si votre système était actif ?
Une solution est de lancer un LiveCD, de monter votre installation de votre système (la partition hôte) et de créer un chroot pour que le root directory (la racine, /) devienne celui de votre installation et non plus celui du LiveCD. Avec cette solution, vous pouvez même changer le mot de passe root de votre système. Question : Qu’est-ce qu’un chroot ?

Le système fichier d’Ubuntu comme tout autre Linux/Unix est construit autour d'une racine (le /) sur laquelle les partitions sont ensuite "montées" formant ainsi l'espace de fichier accessible. Cette racine forme ainsi la référence pour tous les chemins absolus utilisés par un processus et lui permettant d'accéder aux fichiers (librairies, configurations, etc.) qui lui sont nécessaires. Cette racine est un paramètre du processus qu'il est parfaitement possible de modifier grâce à l'utilitaire chroot. La commande Chroot redéfinit l’univers de fonctionnement d’un programme en désignant un répertoire comme sa racine (répertoire chrooté). Plus précisément, il détermine un nouveau répertoire "ROOT" ou "/" pour un programme ou une session. Schématiquement, tout ce qui est à l’extérieur du répertoire "chrooté" n’existe pas pour un programme ou un shell.


Chroot a d'autres utilités. Par exemple si quelqu’un s’introduit dans votre ordinateur, il n'aura pas la possibilité de voir la totalité des fichiers de votre système (sa racine est limitée au répertoire chrooté). Le fait de ne pas voir vos fichiers limite les commandes qu’il peut lancer et ne lui donne pas la possibilité d’exploiter des fichiers qui seraient vulnérables.


Planification des tâches

Linux dispose des outils permettant d'exécuter automatiquement une tâche (une application, une commande, ...) à intervalles de temps réguliers ou bien à des moments précis. Généralement ce type de procédé est utilisé pour automatiser des sauvegardes (on parle de backup), notamment à des heures où le système est le moins sollicité (typiquement pendant la nuit pour les serveurs).
  •   at : vous permet de planifier l'exécution d'une tâche à un moment donné, et ce, une seule fois. La commande peut être installée avec apt-get (sous ubuntu sudo apt-get install at).

  •  cron : vous permet de planifier l'exécution d'une ou plusieurs tâches à des moments selon un intervalle de temps fixé et répété. La commande est installée par défaut (sous ubuntu).

Programme at


Mode interactifVous tapez dans un terminal la commande at suivi de l’heure, le jour… et en retour vous obtenez un prompt qui vous permet de taper la commande à lancer à l’heure dite. Pour sortir, tapez Ctrl+D :

Le format de la date/heure :


  • HHMM ou HH:MM
  • MMJJAA ou MM/JJ/AA ou MM.JJ.AA
  •  now + x minutes / hours / days / weeks : x minutes / heures / jours / semaines à partir de maintenant 
Mode ligne de commande  : La commande at est utilisée avec l'option -f suivi du fichier contenant le script shell et l'heure, le jour :

Pour afficher toutes les tâches planifiées, utilisez atq :


Pour supprimer une tâche, utilisez atrm suivi du numéro de la tâche :

Programme Cron

Tout comme le programme at, cron vous permet de planifier des tâches à exécuter. Contrairement à at qui n'exécutera le programme qu'une seule fois, cron permet l'exécution de manière récurrente : toutes les heures, toutes les minutes, tous les jours, tous les trois jours, etc. Il existe 4 composants principaux : la commande cron, un fichier de configuration contenant les tâches à exécuter (dénommé cron table), une commande crontab et un démon crond.
La commande cron est basée sur un fichier de configuration contenant les tâches planifiées à exécuter. Ce fichier peut être édité à travers la commande crontab. Ne confondez pas la commande crontab et cron : la première commande permet de modifier/éditer le fichier de configuration, et la seconde (cron) lance l'exécution des tâches planifiées.
crond est un démon (plus couramment écrit en anglais Daemon qui signifie : Disk And Execution MONitor) chargé de lancer l'exécution des tâches planifiées dans le fichier de configuration à l'aide de la commande cron. Comme les autres services/démons, il est situé dans /etc/init.d.
La commande crontab a 3 options : -e permettant la modification du fichier de configuration dans un éditeur (vi par défaut sinon celui définit par la variable d'environnement EDITOR, par exemple si vous préférez gedit comme éditeur, il suffit d'ajouter la ligne : export EDITOR=/usr/bin/gedit dans votre fichier .bashrc) ; -l affiche le contenu du fichier de configuration de cron; -r supprime immédiatement le fichier de configuration sans qu'une confirmation ne soit demandée. Pour l’instant, nous ne disposons d’aucun fichier de configuration de cron :

Vous avez sûrement remarqué, chaque utilisateur a son propre fichier de configuration de cron. En effet la commande crontab –e édite en fait un fichier relatif à l'utilisateur qui l'exécute. Ce fichier se situe dans : /var/spool/cron/crontabs/utilisateur. Toutefois l'administrateur (root) peut utiliser une option supplémentaire : −u user. Il spécifie ainsi le fichier de configuration de l'utilisateur qu'il veut éditer, modifier ou supprimer. Editons notre fichier de configuration : crontab -e



L'effet réel de la commande précédente est la création d'un fichier dans le répertoire /var/spool/cron/crontabs/mtoure. Le mien est vide pour le moment.
La syntaxe générale d'une ligne est de cette forme :

Afin de vérifier la syntaxe du fichier, cron vous oblige à passer par la commande crontab -e pour modifier le fichier de configuration de cron. En cas d'erreur, la modification n'est pas prise en compte ....
Exemples : pour exécuter le script /home/mtoure/commandTest/sauve.sh (n'oubliez pas de rendre le script exécutable avec chmod +x sauve.sh) tous les jours à 15h05 on mettra la ligne suivante dans notre fichier crontabs à l'aide de la commande crontab -e : 05 15 * * * /home/mtoure/commandTest/sauve.sh. Exécution de la commande df afin de récupérer un jour dans un fichier de log de l'espace disque libre tous les jours à 23h30 : 30 23 * * * df >>/tmp/log_df.txt.
Pour supprimer votre fichier de configuration crontab supprimant ainsi toutes les tâches planifiées, il suffit d'utiliser la commande : crontab -r :

Des raccourcis clavier Console :

  •  Ctrl + A : aller au début de la ligne
  •  Ctrl + E : aller à la fin de la ligne
  •  Ctrl + K : couper la chaîne du curseur jusqu'à la fin de la ligne
  •  Ctrl + U : couper la chaîne du curseur jusqu'au début de la ligne
  •  Ctrl + W : couper le mot avant le curseur
  •  Ctrl + Y : coller une chaîne