Piste: » oracle10g_connaitre_le_character_set » linux » oracle10g_supprimer_puis_recreer_le_tablespace_temporaire » personnaliser_le_client_ssh » trucs_et_astuces
Trucs et astuces de Linux
Shell
Voici les commandes les plus couramment utilisées en shell sous Linux, mais qui, avec un peu d'astuces et les bonnes options, nous simplifient énormément la vie.
Afficher un fichier avec le numéro des lignes
Avec la commande « cat » on peut afficher le contenu d'un fichier dans un terminal. Souvent, avoir le numéro des lignes est bien utile. « cat » prévoit une option permettant de le faire, mais le bash lui même a une commande qui se nomme « nl » qui fait exactement la même chose.
$ echo -e "un\ndeux\ntrois" > fichier
$ cat fichier
un
deux
trois
$ cat -n fichier
1 un
2 deux
3 trois
$ nl fichier
1 un
2 deux
3 trois
Vi votre fichier contient un grand nombre de lignes, il n'est pas pratique de l'avoir entièrement dans un terminal, on peut donc rediriger la sortie dans un « more » :
$ nl /etc/passwd | more
Afficher un morceau de fichier
Pour afficher la ligne n d'un fichier, on a souvent l'idée de combiner un head et un tail
$ head -n 10 fichier | tail -n 1
Mais encore une fois, c'était sans compter sur la puissance de la commande sed
$ sed -n '10p' fichier
Ceci affichera la ligne 10 du fichier. Il est même possible du coup d'afficher une portion du fichier de cette façon
$ sed -n '10,20p' fichier
Et enfin, vous pouvez également utiliser les symboles « ^ » et « $ » bien connu des expressions régulières pour accéder au début et à la fin du fichier. De cette façon, la commande
# Equivalent à head -n 10 $ sed -n '^,10p' fichier
affichera les 10 premières lignes du fichier, tandis que
$ sed -n '10,$p'
affichera le fichier de la ligne 10 jusqu'à la fin.
Créer facilement et rapidement une arborescence de répertoires
Pour créer une arborescence d'un seul coup, il suffit d'utiliser la commande « mkdir » avec l'argument « -p » :
mkdir -p a/b/{c,d/e,f/g,h/{i,j,k}}
Ce qui donne :
$ ls -R .: a ./a: b ./a/b: c d f h ./a/b/c: ./a/b/d: e ./a/b/d/e: ./a/b/f: g ./a/b/f/g: ./a/b/h: i j k ./a/b/h/i: ./a/b/h/j: ./a/b/h/k:
Faire un grep sur une très longue liste de fichier
La commande grep est une des plus utile dans les systèmes Unix / Linux. Mais souvent, j'ai eu comme problème d'avoir une liste de fichier trop longue. Quand on veut faire une recherche de cette façon :
$ grep mot *
si le répertoire courant contient trop de fichier, la commande ne passe pas car elle est trop longue. Du coup, j'avais pour habitude de procéder ainsi :
$ find -type f -iname '*.ext' --exec grep mot '{}' \;
Du coup de cette façon la liste complète des fichiers du répertoire n'est pas insérée dans ligne de commande et ne pose plus de problème. A part le fait que cela prend nettement plus de temps, cela pose aussi le problème que grep n'affiche pas le nom du fichier étant donné qu'il s'agit de plusieurs grep lancer un après l'autre sur un seul fichier. Pour résoudre ce problème, j'ai trouvé l'argument « -H » qui permet de forcer l'affichage du nom du fichier. Ce qui donne :
$ find -type f -iname '*.ext' --exec grep -H mot '{}' \;
Lister les fichiers d'un répertoire en triant par taille
Voici une commande bien utile
$ ls -lS
Elle permet simplement de lister les fichiers du répertoire courant en triant par taille. Cependant, cette commande n'est pas POSIX et n'est donc pas disponible sur tous les systèmes (Solaris par exemple). Il est donc possible de faire
$ ls -l | sort -nk 5
afin d'obtenir le même effet.
Multiplier les arguments similaires d'une commande sans tout retaper
Lorsque l'on veut faire une copie de sauvegarde d'un fichier, il faut taper le nom du fichier 2 fois. Voici une technique pour éviter de s'embêter :
$ cp NomDuFichierQueJeVeuxPasTaperDeuxFois.txt{,.old}
Cela va exécuter automatiquement la commande :
$ cp NomDuFichierQueJeVeuxPasTaperDeuxFois.txt NomDuFichierQueJeVeuxPasTaperDeuxFois.txt.old
Partager rapidement un fichier en lecture par HTTP
Pour faire rapidement un partage de fichier en lecture seule, mettez cette ligne dans votre fichier « .bashrc » :
alias partagecedossier='python -c "import SimpleHTTPServer;SimpleHTTPServer.test()"'
Ensuite, dans un terminal, mettez vous dans le répertoire que vous souhaitez partager, et tapez
$ partagecedossier
Cela va lancer la commande Python, qui va faire de ce dossier la racine d'un Mini Serveur Web. Il ne reste plus qu'à aller sur l'autre PC et à taper dans un navigateur l'adresse IP du premier PC sur le port 8000.
Raccourcis clavier dans une ligne de commande bash
Quelques raccourcis en ligne de commande pour se déplacer dans la ligne en cours :
- Ctrl-U - supprime tout ce qui se trouve à gauche du curseur
- Ctrl-W - supprime le mot à gauche du curseur
- Ctrl-Y - “Colle” ce qu'il y a dans le buffer
- Ctrl-A - Va au début de la ligne
- Ctrl-E - Va à la fin de la ligne
Récupérer facilement les choses lisible d'un fichier ou du BIOS
La commande « dd » permet de faire un dump de n'importe quel partie du PC. Mais certaines données brute du PC sont assez illisibles. Couplé avec la commande « strings », il est possible d'extraire des informations intéressantes.
# dd if=/dev/mem | strings | less
Cette commande va par exemple permettre de parcourir la mémoire de votre ordinateur. Par vraiment utile mais marrant. On peut par contre allez plus loin et lancer la commande :
# dd if=/dev/mem bs=32k skip=30 count=2 | strings | grep -i bios
Cette commande va vous sortir de la mémoire la version de votre BIOS.
Répété la commande précédente
Utilisez « !! » pour répéter la commande précédent en entier :
$ apt-get install sl $ sudo !!
Ceci permet de reprendre la commande précédente et de la réexecuter avec les droits root.
Répéter le dernier argument de la commande précédente
Utilisez « !$ » pour répéter le dernier argument utilisé dans la commande précédente :
$ touch fichier.txt $ vi !$
Ceci va créer le fichier et l'ouvrir dans vi. Il est aussi possible de faire la combinaison de touche suivante : <ESC> puis “_” (underscore).
Répéter la commande précédente en remplaçant un mot
Utilisez « ^matches^replace » pour reprendre la commande précédente en remplaçant les mots « matches » par « replace » :
$ sudo apt-get install unizp zip $ ^unizp^unzip
De cette façon la commande va se relancer en remplaçant le unizp mal écrit.
Supprimer les lignes vides d'un fichier
Pour supprimer les lignes vides d'un fichier, vous pouvez utiliser la commande grep suivante :
$ grep -v "^$" fichier
Par contre si vous souhaitez sauvegarder le fichier sans les lignes vides, avec la commande grep il faudrait utiliser une fichier temporaire :
$ grep -v "^$" fichier > fichier.tmp && mv fichier.tmp fichier
C'est plutôt complexe de lancer 2 commandes alors que dans ce cas un sed sera mieux approprié
$ sed -i '/^$/d' fichier
Supprimer les fichiers trouvés par la commande find
Souvent, j'utilisais la commande suivante pour supprimer récursivement des fichiers suivants un joker
$ find -name *.bak --exec rm '{}' \;
Et puis un jour, la solution de facilité
$ find -name *.bak -delete
Magnifique, évident, mais fallait le savoir !
Transformer une commande en flux fichier
Savez-vous qu'il est possible de transformer une commande en flux fichier ? Je m'explique ! Quand vous faites la commande suivante :
$ cat fichier
le fichier s'affiche en accédant directement à son contenu. Si maintenant je veux faire le même chose mais avec un fichier à distance, cela peut paraître facile aussi en faisant :
$ ssh user@server cat /rep/fichier
. Mais dans ce cas, j'exécute la commande sur le serveur, si maintenant je veux simplement traiter le contenu du fichier dans une commande comme si c'était un fichier local, je peux le faire avec la redirection suivante :
diff <(ssh user@server1 cat /etc/apt/sources.list) <(ssh user@server2 car /etc/apt/sources.list)
. De cette façon, le programme diff va accéder aux fichiers et les comparer comme si c'était des fichiers locaux.
Commandes utiles
avicat
Pour assembler 2 fichiers avi, il suffit d'installer le package « avifile-utils » qui contient le programme « avicat ».
Cette commande permet de lire entièrement une liste de fichier avi et de les mettre ensemble dans un 1 seul fichier avi.
Le commande s'utilise de cette façon :
avicat -o sortie.avi 1.avi 2.avi 3.avi
column
Cette commande très utile permet de formater rapidement et facilement la sortie d'une commande sous forme de tableau. Plus précisément, vous pouvez indiquer à la commande quel est le caractère de séparation des champs de votre texte, et elle va automatiquement aligner les colonnes avec des tabulations. Par défaut, elle utilise l'espace comme séparateur.
mount | column -t echo "un;deux;trois one;two;three" | column -t -s ';'
mutt
Pour envoyer un mail avec un fichier joint rapidement en ligne de commande, la commande « mutt » est bien utile (pensez à l'installer, elle n'est pas disponible par défaut) :
$ echo "Le corps du mail" | mutt -a fichier_a_joindre.txt -s "le sujet du mail" adresse@domaine.com
Une façon rapide de récupérer un fichier.
reset
Cela vous est sûrement déjà arrivé d'avoir fait un « cat » d'un fichier binaire ou tout autre commande et de vous retrouver avec un terminal complètement buggé avec des caractères bizarre. Il existe la commande « reset » qui permet de réinitialiser le terminal comme si il venait de s'ouvrir. Même si les caractères sont bizarres, tapez « reset » puis entrer.
script
Certains programmes sous Linux ne sont pas simple à installer. Et ils demandent de longue procédure. Du coup, on s'arme d'un terminal et d'un « gedit » pour noter tout ce que l'on fait afin de pouvoir le refaire. Mais c'était sans compter sur la puissance du Shell Linux. La commande « script » permet de lancer un terminal tout en enregistrant ce qui se passe à l'écran.
$ script /tmp/fichier.txt
Ensuite, faites ce que vous voulez dans le terminal et quitter en tapant « exit ». Regardez le fichier « /tmp/fichier.txt », tout est écrit. Seul problème, trop de chose sont écrite, tels que les « backspace » et les « Entrée ». Du coup, ce n'est pas forcément pratique. Une autre technique consiste alors à lancer un nouveau bash en tapant :
# bash -iv 2>&1 | tee /tmp/fichier.txt
« tee » est en fait une commande qui s'occupe de prendre ce qu'elle reçoit en entrée et le renvoie à la fois sur la sortie et dans un fichier. Du coup tout ce que vous allez faire dans le terminal sera inscrit dans le fichier. Mieux, si une autre personne se connecte en SSH sur la machine et fait
# tail -f /tmp/fichier.txt
elle pourra suivre avec vous le déroulement de l'opération. Cela peut également servir pour sécuriser l'accès d'un serveur. Si vous n'aimez pas donner d'accès SSH à votre machine mais que vous n'avez pas le choix, faites ceci :
# touch /usr/local/sbin/my-script # chmod +x !$ # vi !$
puis collez le code suivant :
#!/bin/sh bash -iv 2>&1 | tee -a /var/log/$USER.log
Ensuite dans le fichier « /etc/passwd », recherchez la ligne de l'utilisateur à surveiller, et à la fin de la ligne à la place du fameux « /bin/sh » ou autre, mettez « /usr/local/sbin/my-script ». Du coup, à chaque fois que l'utilisateur va se connecter, tout ce qu'il fait sera enregistrer dans le fichier de log. Cela reste cependant limité car, le fichier de log doit être accessible en écriture pour l'utilisateur en question. Si il connaît l'emplacement du fichier il peut à sa guise le modifier voir le vider pour effacer ses traces.
tailf
On a souvent tendance à faire des « tail -f » sur les fichiers de log. Il est bon de savoir qu'il existe la commande « tailf » qui fait la même chose en mieux (optimisation de l'accès disque notamment).