Commandes utiles
Rédigé par Marc GUILLAUME | Aucun commentaireCes petites commandes que l'on oublie si facilement
Cet article contient diverses petites commandes que l'on n'utilise pas forcément tous les jours et que l'on oublie. C'est un pense-bête dans ma catégorie pense-bête !
Modifier l'éditeur par défaut du système
L'éditeur par défaut de Debian est configuré à l'installation. Si vous avez vos habitudes avec un éditeur particulier et qu'il ne soit pas celui par défaut vous préférerez certainement l'utiliser, par exemple pour éditer les fichiers crontab. Debian propose un outils pour réaliser ce type de choix update-alternatives. La commande liste toutes les alternatives installées sur la machine et vous permet de choisir. La syntaxe est la suivante :
# update-alternatives --config editor
La sortie affiche les éditeurs disponibles affiche quatre possibilités, il y en aurait plus de trois si vous aviez installé d'autres éditeurs (comme joe par exemple). Comme vous l'auriez deviné, dans la liste c'est le nom d'éditeur précédé d'une étoile (*) qui est celui par défaut. Pour ma part j'utilise vim donc c'est celui que je vais choisir à la place de nano par défaut.
There are 3 choices for the alternative editor (providing /usr/bin/editor). Selection Path Priority Status ------------------------------------------------------------ * 0 /bin/nano 40 auto mode 1 /bin/nano 40 manual mode 2 /usr/bin/vim.basic 30 manual mode 3 /usr/bin/vim.tiny 10 manual mode Press enter to keep the current choice[*], or type selection number: 2 update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/editor (editor) in manual mode
Après avoir saisi 2 et pressé Enter si je recommence pour vérifier je vois que l'éditeur a bien changé :
# update-alternatives --config editor There are 3 choices for the alternative editor (providing /usr/bin/editor). Selection Path Priority Status ------------------------------------------------------------ 0 /bin/nano 40 auto mode 1 /bin/nano 40 manual mode * 2 /usr/bin/vim.basic 30 manual mode 3 /usr/bin/vim.tiny 10 manual mode Press enter to keep the current choice[*], or type selection number:
Remplacements par lot avec find et sed
Il est courant de devoir changer une chaîne de caractères qui apparaît dans plusieurs fichiers d'un répertoire et de ses sous-répertoires. Les commandes utiles dans ce cas sont find et sed.
La syntaxe de find est la suivante :
find /chemin/de/recherche -name "motif du fichier recherché" -type f
- find
- Le nom de la commande
- -name
- La chaine représentant le nom du fichier, qui prend les jockers ? et * pour un caractère et n'importe quel caractère
- -type
- Le type de fichier à rechercher. f indique que l'on ne veut que les fichiers (pas les répertoires).
La syntaxe de sed est la suivante :
sed -i 's/chaîne recherchée/chaîne à substituer/g'
- sed
- Le nom de la commande
- -i
- Option attendant des chemins de fichiers et indiquant que l'on veut modifier les fichiers au lieu d'envoyer la modification sur la sortie standard
- 's/chaîne recherchée/chaîne à substituer/g'
- Chaîne indiquant à sed les actions à réaliser. s indique qu'il faut réaliser une substitution, g qu'il faut substituer toutes les occurances de la chaine et pas seulement la première (comportement par défaut). « chaîne recherchée » est le motif qu'il faut rechercher (c'est une regex) et « chaîne à substituer » est la chaîne de remplacement.
L'option -exec commande {} de find permet de relier les deux commandes. la syntaxe est la suivante :
find /home -name "*.txt" -type f -exec sed -i 's/toto/titi/g' {} \;
Dans cet exemple on cherche à remplacer la chaîne toto par la chaîne titi dans tous les fichiers en .txt du répertoire /home. Le point-virgule final indique à find la fin de la commande, il est échappé par un anti-slash pour qu'il ne soit pas interprêté par le shell.
Application : changer toutes les racines du référentiel dans une copie CVS
On postule que la copie de travail CVS se trouve dans /home/toto/monsiteweb/. Les données figurent dans le dossier Root du dossier CVS de chaque répertoire et sous-répertoire. La racine CVS recherchée est la suivante :ext:toto@cvs.exemple.com:/srv/cvs/html et l'on veut lui substituer une racine atteignable en ssh sur un autre port que le port par défaut : :extssh:toto@cvs.exemple.com:2222/srv/cvs/html
find /home/toto/monsiteweb/ -name "Root" -type f -exec sed -i 's/:ext:toto@cvs.exemple.com:\/srv\/cvs\/html/:extssh:toto@cvs.exemple.com:2222\/srv\/cvs\/html/g' {} \;
Il ne faut pas oublier d'échapper avec un anti-slash les slashs qui se trouvent dans les chaînes réprésentant des chemins.
Avant de faire une telle modification récursive il est prudent de faire au préalable une recherche des fichiers impactés :
grep -lR ":ext:toto@cvs.exemple.com:/srv/cvs/html" *
Changer les droits des fichier et répertoires séparément
Autre exemple d'utilisation de l'option -exec de la commande find le changement des droits de tous les répertoires d'une arborescence ou de tous les droits des fichiers d'une arborescence.
Vous avez sans doute remarqué que dans les droits Unix classiques, rwx le droit x n'a pas la même signification pour un fichier que pour un répertoire. Pour un fichier il indique un fichier qui peut être exécuté comme un programme (un script bash par exemple) alors que pour un répertoire il signifie que le répertoire peut-être traversé. Donc si l'on lance une commande de modification des droits sur une arborescence de ce type :
chmod -R g+x /home/mon_user/mon_dossier/
on ne vas pas simplement laisser traverser les répertoires mais aussi mettre un drapeau exécutable à tous les fichiers, ce qui n'est sans doute pas ce que l'on veut. Pour éviter cela on ne va modifier les droits que si le fichier est un répertoire, ce qui va donner avec find quelque chose du genre :
find /home/marc/bidon/ -type d -exec chmod o-rwx {} \;
On retire ainsi les droits sur tous les répertoires sans toucher les fichiers. Imaginons que l'on veuille retirer pour les groupes toutes les autorisations d'exécution pour les fichiers sans modifier pour les répertoires la possibilité de les traverser :
find /home/marc/bidon/ -type f -exec chmod g-x {} \;
Utiliser l'utilitaire screen
Screen est fort utile quand vous administrez des serveurs à distance. Cet utilitaire permet de détacher une session shell de manière à ce que vous puissiez vous déconnecter sans interrompre la tâche en cours, et éventuellement reprendre en main la console dans une autre connexion, éventuellement depuis une autre machine. C'est une assurance qu'une tâche un peu longue ne soit pas interrompue par une perte de connexion avec le serveur par exemple.
L'installation est simple :
apt-get install screen
L'utilisation de base n'est pas très compliquée non plus. Vous vous connectez en tant que l'utilisateur qui vous intéresse, par exemple root, puis vous lancez screen. Un message vous avertit que screen est lancé. Taper une touche efface le message, vous vous retrouvez dans une console comme une autre, sauf que vous pouvez la détacher et vous y ré-attacher quand vous le voulez.
Pour détacher la session Ctrl+A+D, et pour raccrocher la session screen -dr. Si plusieurs sessions screen sont détachées, screen vous présentera une liste des sessions pour savoir laquelle vous voulez rejoindre. Ici j'ai lancé deux sessions screen indépendantes :
$ screen -dr There are several suitable screens on: 1332.pts-3.Marc-ThinkPad-SL510 (08/10/2017 19:31:28) (Detached) 1310.pts-3.Marc-ThinkPad-SL510 (08/10/2017 19:30:47) (Detached) Type "screen [- -r [pidtty.host" to resume one of them.
Si l'on tape Ctrl+D on sort de la session screen en la supprimant.
Créer un fichier de type socket en ligne de commande
Un fichier socket est un fichier spécial qui est utilisé pour communiquer avec une application. Lors du lancement d'une commande ls il se caractérise par la première lettre figurant dans la liste des droits Unix, la lettre s comme on peut le voir par exemple dans le fichier socket de MySQL :
# ls -l /var/run/mysqld/ total 4 -rw-rw---- 1 mysql mysql 6 Nov 12 14:07 mysqld.pid srwxrwxrwx 1 mysql mysql 0 Nov 12 14:07 mysqld.sock
On ne peut pas créer simplement un tel fichier, comme on crée un répertoire avec mkdir
ou un fichier FIFO avec mkfifo
. On doit passer par un langage de programmation permettant de créer ce fichier. On peut le faire en C mais il est plus simple de le faire avec un langage de script qui sera ici en l'espèce Python. Voici un exemple qui crée un fichier de type socket dans le répertoire /tmp
:
# python -c "import socket as s; sock = s.socket(s.AF_UNIX); sock.bind('/tmp/monSocket')" # ll /tmp/monSocket srwxr-xr-x. 1 root root 0 Nov 12 14:22 /tmp/monSocket
On voit que le fichier créé est bien de type socket. La commande peut être utile si par exemple avec vos gros doigts vous supprimez le fichier socket de MySQL... (Je sais ça n'arrive jamais ce genre de chose, mais qui sait ?) ;).
Vous pourrez comme moi recréer votre fichier socket perdu et ainsi pouvoir de nouveau atteindre votre serveur de base de données.
# python -c "import socket as s; sock = s.socket(s.AF_UNIX); sock.bind('/var/run/mysqld/mysqld.sock')" # ls -l /var/run/mysqld/ total 4 -rw-rw---- 1 mysql mysql 6 Nov 12 14:07 mysqld.pid srwxrwxrwx 1 mysql mysql 0 Nov 12 14:07 mysqld.sock
Utiliser dig pour trouver les TTLs d'un site
On peut afficher la ligne complète renvoyée par dig :
$ dig +noall +answer yakati.info yakati.info. 1800 IN A 151.80.59.54
Ou bien interroger un serveur de nom particulier :
$ dig +noall +answer @ns-14-b.gandi.net yakati.info yakati.info. 1800 IN A 151.80.59.54
La signification des options utilisées est la suivante :
+noall
- Supprime les flags et commentaires.
+answer
- Rétablit juste la partie réponse qui avait été enlevée par l'option précédente.
On pourrait rajouter l'option +nocmd
si l'on passait des options à dig que l'on ne voudrait pas voir à l'affichage.
Afficher la taille des fichiers cachés
L'utilitaire du peut, avec l'option -a afficher des fichiers cachés, mais si l'on veut n'avoir que les fichiers cachés on peut utiliser :
du .[!.]?*On peut ensuite raffiner la chose, en fixant une unité d'affichage unique (par exemple le Gigabit avec l'option -BG et l'option -s de sommation pour avoir la taille des fichiers et dossiers cachés et même rajouter un tri :
du -BG -s .[!.]?* | sort