Logo Khaganat

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Dernière révisionLes deux révisions suivantes
fr:bestpractices [2018/03/29 23:06] – [Largeur] merlin8282fr:bestpractices [2018/03/29 23:40] – /* split en plusieurs articles, plus courts et faciles à lire */ merlin8282
Ligne 95: Ligne 95:
  
  
- 
- 
-===== Commandes unix ===== 
-==== sar : System Activity Reporter ==== 
-  sar -A 
- 
-C'est une sorte de monitoring de la machine locale. 
- 
-==== ethtool ==== 
-  ethtool -p eth0 # same as "ethtool --identify eth0" 
-  ethtool -t eth0 # selftest 
-  ethtool -S eth0 # same as "ethtool --statistics eth0" 
- 
-''ethtool'' permet d'avoir des infos sur le matériel réseau, mais aussi d'identifier une interface physique en en faisant clignoter les LEDs (option ''-p''). 
- 
- 
-==== nc / netcat ==== 
-''netcat'' permet à la base d'établir une connexion TCP, un peu comme le permet la commande ''telnet'', à la différence que netcat procède uniquement à la connexion TCP, tandis que telnet tente d'établir une connexion au service de comande à distance éponyme (il y a toute la communication du protocole telnet en plus). 
- 
-''netcat'' permet aussi par exemple de transférer des fichiers d'un système à un autre : 
- 
-  $ nc -l 10.1.1.149 1234 > filename.out # à exécuter côté serveur 
-  $ nc 10.1.1.149 1234 < filename.in # à exécuter côté client 
- 
-On peut aussi scanner des ports avec netcat, pour voir si un port est ouvert ou fermé : 
- 
-  $ nc -zv 10.1.1.149 20-30 
-  $ nc -zv 10.1.1.149 22 80 443 
- 
-La première commande scanne les ports 20 à 30, la seconde scanne les ports 22, 80 et 443 de l'adresse IP 10.1.1.149. 
- 
- 
-==== at ==== 
-''at'' permet de programmer une commande à exécuter une seule fois, contrairement à ''cron'' qui est plutôt destiné à des tâches récurrentes. 
- 
-  echo "tar czf /tmp/homes.tgz /home" | at 1337 
- 
-Créer un tarball compressé avec gzip du dossier /home dans le fichier /tmp/homes.tgz à 13:37. 
- 
- 
-==== cal ==== 
-Calendrier : 
- 
-  $ cal 
-       March 2018        
-  Su Mo Tu We Th Fr Sa   
-                2  3   
-    5  6  7  8  9 10   
-  11 12 13 14 15 16 17   
-  18 19 20 21 22 23 24   
-  25 26 27 28 29 30 31 
-   
-  $ cal jan 1337 
-      January 1337       
-  Su Mo Tu We Th Fr Sa   
-            1  2  3  4   
-    6  7  8  9 10 11   
-  12 13 14 15 16 17 18   
-  19 20 21 22 23 24 25   
-  26 27 28 29 30 31 
-   
-  $ cal dec 9999 
-     December 9999       
-  Su Mo Tu We Th Fr Sa   
-            1  2  3  4   
-    6  7  8  9 10 11   
-  12 13 14 15 16 17 18   
-  19 20 21 22 23 24 25   
-  26 27 28 29 30 31 
- 
- 
-==== tr ==== 
-''tr'' permet la substitution de caractères dans une chaîne de caractères, tout en suivant une certaine logique. Quelques exemples : 
- 
-  $ echo "123 456 789" | tr " " "\n" 
-  123 
-  456 
-  789 
- 
-Remplacer toutes les espaces par un retour à la ligne. 
- 
-  echo "abcd" | tr "a-d" "p-s" 
-  pqrs 
- 
-Remplacer les caractères de 'a' à 'd' par 'p' à 's'. 
- 
-  echo "abcd" | tr "a-d" "1-4" 
- 
-Remplacer les caractères de 'a' à 'd' par 1 à 4. 
- 
-  echo "abcd" | tr "abd" "678" 
-  67c8 
- 
-Remplacer les caractères 'a', 'b' et 'd' par 6, 7 et 8. 
- 
-  echo "abcd" | tr "ac" "xvpb" 
-  xbvd 
- 
-Remplacer les caractères 'a' et 'c' par 'x' et 'v'. N'y ayant pas d'autres caractère à "matcher" (le premier paramètre à la commande ''tr''), 'p' et 'b' n'ont ici aucun intérêt et peuvent être omis / n'ont aucune incidence. 
- 
- 
-==== awk ==== 
-''awk'' est plus qu'une "simple" commande, c'est un langage de programmation permettant notamment de manipuler des chaînes de caractères. Ici nous n'allons voir que des exemples en ligne de commande, bien qu'il soit tout à fait possible d'écrire des programmes plus gros en awk, à la même manière que les scripts shell. Couramment ces petits "mini-programmes" en ligne de commandes sont appelés des ''oneliners'', du fait qu'ils tiennent sur une seule ligne. 
- 
-Voici quelques exemples, qui sont loin d'être exhaustifs quant à ce qu'il est possible de faire avec awk. Cela dit, ils donneront déjà un petit aperçu. 
- 
-  $ sentence="year-month-day hours:minutes:seconds :ms \"this is a comment\"" 
-  $ printf "%s\n" "$sentence" | awk '{print $1}' 
-  year-month-day 
- 
-Cela affiche le premier élément de la phrase, les éléments étant (par défaut) les chaînes de caractères séparées par une espace. 
- 
-  $ printf "%s\n" "$sentence" | awk '{print $NF}' 
-  comment" 
- 
-''$NF'' est une variable spéciale pointant vers le dernier élément. 
- 
-  $ printf "%s\n" "$sentence" | awk 'BEGIN{FS = "\""} {print $(NF-1)}' 
-  this is a comment 
- 
-Ici on redéfinit le séparateur, qui est par défaut l'espace, pour utiliser à la place le caractère ''"''. On dit à awk d'afficher l'avant-dernier (''$(NF-1)'') élément. 
- 
- 
-  $ printf "%s\n" "$sentence" | awk 'BEGIN{FS = " :"} {print $2}' 
-  ms "this is a comment" 
- 
-Redéfinition du séparateur à '' :'' (espace + double-point), et affichage du second élément. 
- 
-  $ printf "%s\n" "$sentence" | awk '/minutes/ {print $0}' 
-  year-month-day hours:minutes:seconds :ms "this is a comment" 
- 
-On peut aussi matcher des expressions rationnelles avec ''awk''. Ici, toutes les lignes contenant le mot ''minutes'' seront affichées, ''$0'' représentant la ligne entière. 
- 
-  $ printf "%s\n" "$sentence" | awk '/minutes/ {print $3}' 
-  :ms 
- 
-On peut aussi n'afficher que le troisième élément des lignes contenant le mot ''minutes''. 
- 
-  $ lines="$(echo "line1 line2 line3" | tr " " "\n")" 
-  $ printf "%s\n" "$lines" | awk '$1 ~ /line2/ {print $0}' 
-  line2 
- 
-On peut dire à awk de ne chercher une chaîne correspondante que dans un seul élément ; ici on cherche ''line2'' dans le premier élément de chaque ligne. 
- 
-  $ printf "%s\n" "$lines" | awk '/line2/ {print $0}' 
-  line2 
- 
-Cela revient au final à la même chose que ci-dessus, étant donné que l'on n'a qu'un seul élément par ligne. 
- 
-  $ printf "%s\n" "$lines" | awk '/line/ {print $0}' 
-  line1 
-  line2 
-  line3 
- 
-On matche ''line'', donc toutes les trois lignes sont affichées. 
- 
-  $ printf "%s\n" "$lines" | awk '/e3/ {print $0}' 
-  line3 
- 
-Eh oui, seul ''e3'' est matché. 
- 
- 
- 
-===== Options peu utilisées/connues ===== 
-On trouve souvent des exemples de commandes sur le web, sur comment effectuer telle ou telle action. Cependant, ce que l'on voit de ces commandes pourtant si puissantes n'est que la partie émergée de l'iceberg. J'estime qu'il est intéressant voire important d'avoir au moins vu une fois de quoi sont capables toutes ces commandes que l'on peut être amené à utiliser sur son shell. 
-==== find ==== 
- 
-  find /var/ -mount -maxdepth 1 -type f -exec ls -lh {} \; 
- 
-La commande ''find'' a beaucoup d'options. Ici on en utilise quelques unes, en l'occurrence -mount, qui ne cherche que dans le système de fichiers contenant ou étant monté sur ''/var''. L'option -mount sera utilisée par souci de compatibilité avec les anciennes versions de ''find'', sinon on lui préférera le nom ''-xdev'', qui est exactement la même option. 
- 
-''-maxdepth 1'' indique de ne chercher que dans le sous-dossier direct. On peut indiquer la profondeur de recherche en augmentant la valeur. 
- 
-''-type f'' : le type de fichier que l'on cherche ; 'f' pour un fichier, 'd' pour un dossier, 'l' pour un lien symbolique, etc. 
- 
-Enfin ''-exec'' indique une commande à effectuer pour chaque fichier trouvé (représenté par ''{}''). La fin de cette commande est indiquée par ''\;''. Le point-virgule est échappé par une contre-oblique sinon il est interprété par le shell. 
-Il est possible de mettre le signe '+' à la place de ''\;'', ce qui aura pour effet de ne pas lancer la commande pour chaque fichier trouvé, mais de ne la lancer qu'une seule fois, avec une liste de tous les fichiers en paramètre. 
- 
- 
-==== grep / wc ==== 
-On voit très très souvent des oneliners qui, pour compter le nombre de lignes font ceci : 
- 
-  [commande] | wc -l 
- 
-Jusque là aucun souci. En revanche, quand on veut filtrer, très souvent on utilise ''grep'' : 
- 
-  [commande] | grep "machin" | wc -l 
- 
-Là, ça commence à piquer les yeux. OK, vous allez dire que je suis un vieux de la vieille qui voit le mal partout, qui cherche à économiser le moindre octet en mémoire, qu'on n'est plus à une époque où la mémoire était chère et rare... Qu'à cela ne tienne ! Plus c'est court, plus c'est élégant, mieux c'est ! 
- 
-Ça commence à piquer les yeux parce-que grep sait très bien compter tout seul ! 
- 
-  [commande] | grep -c "machin" 
- 
-Et voilà ! L'option ''-c'' de ''grep'' retourne le nombre de lignes où ''machin'' a été trouvé. 
- 
- 
- 
-===== Sysadmin en général ===== 
-==== Reboot ==== 
-Quoi que l'on fasse comme modification sur un système, il faut toujours veiller à ce qu'après un redémarrage la machine se retrouve dans un état identique à celui dans lequel elle était avant ce redémarrage. 
- 
-Par exemple, quand on ajoute une route sur la CLI, bien veiller à ce que la route soit aussi configurée "en dur". Dans le cas de Debian, on peut mettre la commande dans par exemple ''/etc/network/interfaces'' en ajoutant ''up ''  devant la commande qu'on a exécuté. 
- 
-  CLI : 
-  route add -host ftp.fr.debian.org gw 192.168.100.253 
- 
-  /etc/network/interfaces : 
-  iface eth0 inet static 
-      address [...] 
-  up route add -host ftp.fr.debian.org gw 192.168.100.253 
-  down route del -host ftp.fr.debian.org gw 192.168.100.253 
- 
-Attention à la seconde ligne avec ''down'', ce n'est pas ''route add'' mais ''route del'', pour supprimer la route lors de l'extinction ou du redémarrage. 
- 
-Cela n'est qu'un exemple. À chaque modification il faut se poser la question : "Est-ce que ma modification est «reboot-proof» ?" 
- 
- 
-==== find ==== 
-Pour supprimer des fichiers de manière automatisée on pourrait être tenté d'exécuter ce genre de commande : 
- 
-  rm -rf `find /var/tmp/ -type d -name .svn` 
- 
-Cette commande cherche tous les dossiers nommés ''.svn'' dans /var/tmp/ de manière récursive, puis passe le résultat à la commande ''rm -rf''. Le problème qui peut se poser est si dans cette liste de dossiers, l'un d'eux contient une espace dans son chemin, la commande va échouer et donc ce dossier ne sera pas supprimé. 
- 
-Pour bien faire les choses, autant dire directement à la commande ''find'' de supprimer les dossiers trouvés, via l'option ''-exec'' : 
- 
-  find /var/tmp/ -type d -name .svn -exec rm -rf {} \; 
  
  
 {{tag>Tag_a_ajouter}} {{tag>Tag_a_ajouter}}
CC Attribution-Share Alike 4.0 International Driven by DokuWiki
fr/bestpractices.txt · Dernière modification : 2021/12/03 19:19 de 127.0.0.1

Licences Mentions légales Accueil du site Contact