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 : où 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
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 n 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 :
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 tee. La 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 interactif : Vous 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
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.
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