Réseau - Web - GNU/Linux

2010 04 mars

Commandes utiles

Rédigé par Marc GUILLAUME | Aucun commentaire

Ces 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

Écrire un commentaire

Quelle est la première lettre du mot gshc ?

Fil RSS des commentaires de cet article

À propos

Yakati.info - Réseau - Web - GNU/Linux © 2017

Généré par PluXml en 0.02s  - Administration

Mes coordonnées

Marc Guillaume
contact[at]yakati.info
79150 ÉTUSSON

Crédits

Pour la gestion du contenu

Généré par PluXml, le Blog ou Cms sans base de données

Pour le contenu

Licence Creative Commons
Ce(tte) œuvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.

Pour le thème

Thème SOLID de blacktie.co adapté pour PluXml