20 commandes Linux que tout administrateur système devrait connaître
Si votre application ne fonctionne pas ou si vous recherchez simplement plus d'informations, ces 20 commandes vous seront utiles.
Dans un monde regorgeant de nouveaux outils et d'environnements de développement diversifiés, il est pratiquement nécessaire pour tout développeur ou ingénieur d'apprendre quelques commandes d'administration système de base. Des commandes et des packages spécifiques peuvent aider les développeurs à organiser, dépanner et optimiser leurs applications et, en cas de problème, fournir des informations de tri précieuses aux opérateurs et aux administrateurs système.
Que vous soyez un nouveau développeur ou que vous souhaitiez gérer votre propre application, les 20 commandes d'administration système de base suivantes peuvent vous aider à mieux comprendre vos applications. Ils peuvent également vous aider à décrire les problèmes aux administrateurs système pour déterminer pourquoi une application peut fonctionner localement mais pas sur un hôte distant. Ces commandes s'appliquent aux environnements de développement Linux, aux conteneurs, aux machines virtuelles (VM) et au bare metal.
1. boucler
curl transfère une URL. Utilisez cette commande pour tester le point de terminaison d’une application ou la connectivité à un point de terminaison de service en amont. curl peut être utile pour déterminer si votre application peut atteindre un autre service, tel qu'une base de données, ou pour vérifier si votre service est sain.
À titre d'exemple, imaginez que votre application renvoie une erreur HTTP 500 indiquant qu'elle ne peut pas atteindre une base de données MongoDB :
$ curl -I -s myapplication:5000
HTTP/1.0 500 INTERNAL SERVER ERROR
L'option -I affiche les informations d'en-tête et l'option -s fait taire le corps de la réponse. Vérification du point de terminaison de votre base de données depuis votre bureau local :
$ curl -I -s database:27017
HTTP/1.0 200 OK
Alors, quel pourrait être le problème ? Vérifiez si votre application peut accéder à d'autres endroits que la base de données à partir de l'hôte de l'application :
$ curl -I -s https://opensource.com
HTTP/1.1 200 OK
Cela semble aller. Essayez maintenant d'accéder à la base de données depuis l'hôte de l'application. Votre application utilise le nom d'hôte de la base de données, alors essayez-le d'abord :
$ curl database:27017
curl: (6) Couldn't resolve host 'database'
Cela indique que votre application ne peut pas résoudre la base de données car l'URL de la base de données n'est pas disponible ou l'hôte (conteneur ou VM) ne dispose pas d'un serveur de noms qu'il peut utiliser pour résoudre le nom d'hôte.
2. python -m json.tool/jq
Après avoir émis curl, le résultat de l'appel d'API peut être difficile à lire. Parfois, vous souhaitez imprimer joliment la sortie JSON pour trouver une entrée spécifique. Python dispose d'une bibliothèque JSON intégrée qui peut vous aider. Vous utilisez python -m json.tool pour indenter et organiser le JSON. Pour utiliser le module JSON de Python, dirigez la sortie d'un fichier JSON vers la commande python -m json.tool.
$ cat test.json
{"title":"Person","type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"age":{"description":"Age in years","type":"integer","minimum":0}},"required":["firstName","lastName"]}
Pour utiliser la bibliothèque Python, dirigez la sortie vers Python avec l'option -m (module).
$ cat test.json | python -m json.tool
{
"properties": {
"age": {
"description": "Age in years",
"minimum": 0,
"type": "integer"
},
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
}
},
"required": [
"firstName",
"lastName"
],
"title": "Person",
"type": "object"
}
Pour une analyse JSON plus avancée, vous pouvez installer jq. jq fournit des options qui extraient des valeurs spécifiques de l'entrée JSON. Pour imprimer joliment comme le module Python ci-dessus, appliquez simplement jq à la sortie.
$ cat test.json | jq
{
"title": "Person",
"type": "object",
"properties": {
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
},
"age": {
"description": "Age in years",
"type": "integer",
"minimum": 0
}
},
"required": [
"firstName",
"lastName"
]
}
3. c
ls répertorie les fichiers dans un répertoire. Les administrateurs système et les développeurs émettent cette commande assez souvent. Dans l'espace conteneur, cette commande peut aider à déterminer le répertoire et les fichiers de votre image conteneur. En plus de rechercher vos fichiers, ls peut vous aider à examiner vos autorisations. Dans l'exemple ci-dessous, vous ne pouvez pas exécuter myapp en raison d'un problème d'autorisations. Lorsque vous vérifiez les permissions en utilisant ls -l, vous vous rendez compte que les permissions n'ont pas de "x" dans -rw-r--r--, qui sont lues et écrire seulement.
$ ./myapp
bash: ./myapp: Permission denied
$ ls -l myapp
-rw-r--r--. 1 root root 33 Jul 21 18:36 myapp
4. queue
tail affiche la dernière partie d'un fichier. Vous n'avez généralement pas besoin de chaque ligne de journal pour résoudre les problèmes. Au lieu de cela, vous souhaitez vérifier ce que disent vos journaux sur la demande la plus récente adressée à votre application. Par exemple, vous pouvez utiliser tail pour vérifier ce qui se passe dans les journaux lorsque vous effectuez une requête à votre serveur HTTP Apache.
opensource.com
L'option -f indique l'option "follow", qui génère les lignes de journal au fur et à mesure de leur écriture dans le fichier. L'exemple comporte un script en arrière-plan qui accède au point de terminaison toutes les quelques secondes et le journal enregistre la demande. Au lieu de suivre le journal en temps réel, vous pouvez également utiliser tail pour voir les 100 dernières lignes du fichier avec l'option -n.
$ tail -n 100 /var/log/httpd/access_log
5. chat
cat concatène et imprime les fichiers. Vous pouvez émettre cat pour vérifier le contenu de votre fichier de dépendances ou pour confirmer la version de l'application que vous avez déjà créée localement.
$ cat requirements.txt
flask
flask_pymongo
L'exemple ci-dessus vérifie si votre application Python Flask a Flask répertorié comme dépendance.
6. grep
grep recherche les modèles de fichiers. Si vous recherchez un modèle spécifique dans la sortie d'une autre commande, grep met en évidence les lignes pertinentes. Utilisez cette commande pour rechercher des fichiers journaux, des processus spécifiques, etc. Si vous voulez voir si Apache Tomcat démarre, vous pourriez être submergé par le nombre de lignes. En redirigeant cette sortie vers la commande grep, vous isolez les lignes qui indiquent le démarrage du serveur.
$ cat tomcat.log | grep org.apache.catalina.startup.Catalina.start
01-Jul-2017 18:03:47.542 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 681 ms
7. ps
La commande ps , qui fait partie du package procps-ng qui fournit des commandes utiles pour enquêter sur les ID de processus, affiche l'état d'un processus en cours d'exécution. Utilisez cette commande pour déterminer une application en cours d’exécution ou confirmer un processus attendu. Par exemple, si vous souhaitez rechercher un serveur Web Tomcat en cours d'exécution, vous utilisez ps avec ses options pour obtenir l'ID de processus de Tomcat.
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 2 18:55 ? 00:00:02 /docker-java-home/jre/bi
root 59 0 0 18:55 pts/0 00:00:00 /bin/sh
root 75 59 0 18:57 pts/0 00:00:00 ps -ef
Pour encore plus de lisibilité, utilisez ps et redirigez-le vers grep.
$ ps -ef | grep tomcat
root 1 0 1 18:55 ? 00:00:02 /docker-java-home/jre/bi
8. environnement
env vous permet de définir ou d'imprimer les variables d'environnement. Lors du dépannage, cela peut vous être utile pour vérifier si une mauvaise variable d'environnement empêche le démarrage de votre application. Dans l'exemple ci-dessous, cette commande est utilisée pour vérifier les variables d'environnement définies sur l'hôte de votre application.
$ env
PYTHON_PIP_VERSION=9.0.1
HOME=/root
DB_NAME=test
PATH=/usr/local/bin:/usr/local/sbin
LANG=C.UTF-8
PYTHON_VERSION=3.4.6
PWD=/
DB_URI=mongodb://database:27017/test
Notez que l'application utilise Python et dispose de variables d'environnement pour se connecter à une base de données MongoDB.
9. haut
top affiche et met à jour les informations de processus triées. Utilisez cet outil de surveillance pour déterminer quels processus sont en cours d'exécution et combien de mémoire et de CPU ils consomment. Un cas courant se produit lorsque vous exécutez une application et qu'elle meurt une minute plus tard. Tout d’abord, vous vérifiez l’erreur de retour de l’application, qui est une erreur de mémoire.
$ tail myapp.log
Traceback (most recent call last):
MemoryError
Votre applicationvraiment manque de mémoire ? Pour confirmer, utilisez top pour déterminer la quantité de CPU et de mémoire consommée par votre application. Lorsque vous publiez top, vous remarquez une application Python utilisant la majeure partie du processeur, avec une utilisation de la mémoire croissante, et vous soupçonnez qu'il s'agit de votre application. Pendant son exécution, vous appuyez sur la touche "C" pour voir la commande complète et procéder à une ingénierie inverse si le processus correspond à votre application. Il s'avère que c'est votre application gourmande en mémoire (memeater.py). Lorsque votre application manque de mémoire, le système la tue avec une erreur de manque de mémoire (MOO).
opensource.com
opensource.com
En plus de vérifier votre propre application, vous pouvez utiliser top pour déboguer d'autres processus qui utilisent le processeur ou la mémoire.
10. netstat
netstat affiche l'état du réseau. Cette commande affiche les ports réseau utilisés et leurs connexions entrantes. Cependant, netstat n'est pas prêt à l'emploi sous Linux. Si vous devez l'installer, vous pouvez le trouver dans le package net-tools. En tant que développeur qui expérimente localement ou envoie une application vers un hôte, vous pouvez recevoir une erreur indiquant qu'un port est déjà alloué ou qu'une adresse est déjà utilisée. L'utilisation de netstat avec les options de protocole, de processus et de port démontre que le serveur HTTP Apache utilise déjà le port 80 sur l'hôte ci-dessous.
opensource.com
11. IP
Si l'adresse ip ne fonctionne pas sur votre hôte, elle doit être installée avec le package iproute2. La sous-commande address (ou simplement ip a en abrégé) affiche les interfaces et les adresses IP de l'hôte de votre application. Vous utilisez l'adresse IP pour vérifier l'adresse IP de votre conteneur ou de votre hôte. Par exemple, lorsque votre conteneur est connecté à deux réseaux, l'adresse IP peut indiquer quelle interface se connecte à quel réseau. Pour une vérification simple, vous pouvez toujours utiliser la commande ip address pour obtenir l'adresse IP de l'hôte. L'exemple ci-dessous montre que le conteneur de niveau Web possède une adresse IP de 172.17.0.2 sur l'interface eth0.
$ ip address show eth0
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether d4:3b:04:9e:b2:c2 brd ff:ff:ff:ff:ff:ff
inet 10.1.1.3/27 brd 10.1.1.31 scope global dynamic noprefixroute eth0
valid_lft 52072sec preferred_lft 52072sec
12. lsof
lsof répertorie les fichiers ouverts associés à votre application. Sur certaines images de machine Linux, vous devez installer lsof avec le package lsof. Sous Linux, presque toutes les interactions avec le système sont traitées comme un fichier. Par conséquent, si votre application écrit dans un fichier ou ouvre une connexion réseau, lsof reflétera cette interaction sous forme de fichier. Semblable à netstat, vous pouvez utiliser lsof pour vérifier les ports d'écoute. Par exemple, si vous souhaitez vérifier si le port 80 est utilisé, vous utilisez lsof pour vérifier quel processus l'utilise. Ci-dessous, vous pouvez voir que httpd (Apache) écoute sur le port 80. Vous pouvez également utiliser lsof pour vérifier l'ID de processus de httpd, en examinant où réside le binaire du serveur Web (/usr/sbin /httpd).
opensource.com
Le nom du fichier ouvert dans la liste des fichiers ouverts permet d'identifier l'origine du processus, en particulier Apache.
13. df
Vous pouvez utiliser df (afficher l'espace disque disponible) pour résoudre les problèmes d'espace disque. Lorsque vous exécutez votre application sur un orchestrateur de conteneur, vous pouvez recevoir un message d'erreur signalant un manque d'espace libre sur l'hôte du conteneur. Bien que l'espace disque doive être géré et optimisé par un administrateur système, vous pouvez utiliser df pour déterminer l'espace existant dans un répertoire et confirmer si vous manquez effectivement d'espace.
$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 7.7G 0 7.7G 0% /dev
/dev/mapper/RHEL-Root 50G 16G 35G 31% /
/dev/nvme0n1p2 3.0G 246M 2.8G 9% /boot
/dev/mapper/RHEL-Home 100G 88G 13G 88% /home
/dev/nvme0n1p1 200M 9.4M 191M 5% /boot/efi
/dev/sdb1 114G 55G 54G 51% /run/media/tux/red
L'option -h imprime les informations dans un format lisible par l'homme. Par défaut, comme dans l'exemple, df fournit des résultats pour tout ce qui se trouve sous le répertoire racine, mais vous pouvez également limiter les résultats en fournissant un répertoire dans le cadre de votre commande (comme df -h/maison).
14. du
Pour récupérer des informations plus détaillées sur les fichiers qui utilisent l'espace disque dans un répertoire, vous pouvez utiliser la commande du. Si vous souhaitez savoir quel journal occupe le plus de place dans le répertoire /var/log par exemple, vous pouvez utiliser du avec le -h (lisible par l'homme) et l'option -s pour la taille totale.
$ du -sh /var/log/*
1.8M /var/log/anaconda
384K /var/log/audit
4.0K /var/log/boot.log
0 /var/log/chrony
4.0K /var/log/cron
4.0K /var/log/maillog
64K /var/log/messages
L'exemple ci-dessus révèle que le plus grand répertoire sous /var/log est /var/log/audit. Vous pouvez utiliser du en conjonction avec df pour déterminer ce qui utilise l'espace disque sur l'hôte de votre application.
15. identifiant
Pour vérifier l'utilisateur qui exécute l'application, utilisez la commande id pour renvoyer l'identité de l'utilisateur. L'exemple ci-dessous utilise Vagrant pour tester l'application et isoler son environnement de développement. Après vous être connecté à la boîte Vagrant, si vous essayez d'installer le serveur HTTP Apache (une dépendance), le système indique que vous ne pouvez pas exécuter la commande en tant que root. Pour vérifier votre utilisateur et votre groupe, émettez la commande id et notez que vous exécutez en tant qu'utilisateur "vagrant" dans le groupe "vagrant".
$ dnf -y install httpd
Loaded plugins: fastestmirror
You need to be root to perform this command.
$ id
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Pour corriger cela, vous devez exécuter la commande en tant que superutilisateur, ce qui fournit des privilèges élevés.
16. chmod
Lorsque vous exécutez le binaire de votre application pour la première fois sur votre hôte, vous pouvez recevoir le message d'erreur « autorisation refusée ». Comme le montre l'exemple de ls, vous pouvez vérifier les autorisations du binaire de votre application.
$ ls -l
total 4
-rw-rw-r--. 1 vagrant vagrant 34 Jul 11 02:17 test.sh
Cela montre que vous n'avez pas de droits d'exécution (pas de "x") pour exécuter le binaire. chmod peut corriger les autorisations pour permettre à votre utilisateur d'exécuter le binaire.
$ chmod +x test.sh
[vagrant@localhost ~]$ ls -l
total 4
-rwxrwxr-x. 1 vagrant vagrant 34 Jul 11 02:17 test.sh
Comme le montre l'exemple, cela met à jour les autorisations avec les droits d'exécution. Désormais, lorsque vous essayez d'exécuter votre binaire, l'application ne génère pas d'erreur d'autorisation refusée. Chmod peut également être utile lorsque vous chargez un binaire dans un conteneur. Cela garantit que votre conteneur dispose des autorisations appropriées pour exécuter votre binaire.
17. creuser/nslookup
Un serveur de noms de domaine (DNS) permet de résoudre une URL vers un ensemble de serveurs d'applications. Cependant, vous constaterez peut-être qu'une URL ne se résout pas, ce qui entraîne un problème de connectivité pour votre application. Par exemple, supposons que vous tentiez d'accéder à votre base de données à l'URL mabase de données à partir de l'hôte de votre application. Au lieu de cela, vous recevez une erreur « Impossible de résoudre ». Pour résoudre le problème, essayez d'utiliser dig (utilitaire de recherche DNS) ou nslookup (interroger les serveurs de noms Internet) pour comprendre pourquoi l'application ne semble pas résoudre la base de données.
$ nslookup mydatabase
Server: 10.0.2.3
Address: 10.0.2.3#53
** server can't find mydatabase: NXDOMAIN
L'utilisation de nslookup montre que ma base de données ne peut pas être résolue. Essayer de résoudre avec dig donne le même résultat.
$ dig mydatabase
; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7_3.1 <<>> mydatabase
;; global options: +cmd
;; connection timed out; no servers could be reached
Ces erreurs peuvent être causées par de nombreux problèmes différents. Si vous ne parvenez pas à déboguer la cause première, contactez votre administrateur système pour une enquête plus approfondie. Pour les tests locaux, ce problème peut indiquer que les serveurs de noms de votre hôte ne sont pas configurés correctement. Pour utiliser ces commandes, vous devrez installer le package BIND Utilities .
18. pare-feu-cmd
Traditionnellement, les pare-feu étaient configurés sous Linux avec la commande iptables, et bien qu'elle conserve son omniprésence, elle a en fait été largement remplacée par nftables. Une interface conviviale pour nftables, et celle fournie par défaut avec de nombreuses distributions, est firewall-cmd. Cette commande vous aide à définir des règles régissant le trafic réseau, sortant et entrant, autorisé par votre ordinateur. Ces règles peuvent être regroupées en zones, afin que vous puissiez passer rapidement et facilement d'un ensemble de règles à un autre, en fonction de vos besoins.
La syntaxe de la commande est simple. Vous utilisez la commande et un certain nombre d'options, toutes nommées de manière à vous aider à construire une phrase presque lisible par l'homme. Par exemple, pour voir dans quelle zone vous vous trouvez actuellement :
$ sudo firewall-cmd --get-active-zones``
corp
interfaces: ens0
dmz
interfaces: ens1
Dans cet exemple, votre ordinateur dispose de deux périphériques réseau, l'un étant affecté à la zone corp
, tandis que l'autre est affecté à la zone dmz
.
Pour voir ce que chaque zone autorise, vous pouvez utiliser l'option --list-all
:
$ sudo firewall-cmd --zone corp --list-all
corp
target: default
interfaces: ens0
services: cockpit dhcpv6-client ssh
ports:
protocols:
[...]
L'ajout de services est tout aussi simple :
$ sudo firewall-cmd --add-service http --permanent
$ sudo firewall-cmd --reload
L'interaction avec firewall-cmd est conçue pour être intuitive et dispose d'une vaste collection de services prédéfinis, ainsi que de la possibilité d'écrire directement des règles nft. Une fois que vous commencez à utiliser firewall-cmd, vous pouvez télécharger notre aide-mémoire firewall-cmd pour vous aider à vous souvenir de ses options les plus importantes.
19. statut
Vous trouvez généralement SELinux (un module de sécurité Linux) appliqué sur un hôte d'application géré par une entreprise. SELinux fournit un accès avec le moindre privilège aux processus exécutés sur l'hôte, empêchant les processus potentiellement malveillants d'accéder aux fichiers importants du système. Dans certaines situations, une application doit accéder à un fichier spécifique mais peut générer une erreur. Pour vérifier si SELinux bloque l'application, utilisez tail et grep pour rechercher un message "refusé" dans la journalisation /var/log/audit . Sinon, vous pouvez vérifier si SELinux est activé dans la boîte en utilisant sestatus.
$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 28
La sortie ci-dessus indique que l'hôte de l'application a activé SELinux. Sur votre environnement de développement local, vous pouvez mettre à jour SELinux pour qu'il soit plus permissif. Si vous avez besoin d'aide avec un hôte distant, votre administrateur système peut vous aider à déterminer la meilleure pratique pour permettre à votre application d'accéder au fichier dont elle a besoin. Si vous interagissez fréquemment avec SELinux, téléchargez notre aide-mémoire SELinux pour une référence rapide.
20. histoire
Lorsque vous émettez autant de commandes de test et de débogage, vous risquez d’oublier les plus utiles ! Chaque shell a une variante de la commande history. Il affiche l'historique des commandes que vous avez émises depuis le début de la session. Vous pouvez utiliser l'historique pour enregistrer les commandes que vous avez utilisées pour dépanner votre application. Par exemple, lorsque vous émettez un historique au cours de cet article, il affiche les différentes commandes que vous avez expérimentées et apprises.
$ history
1 clear
2 df -h
3 du
Que faire si vous souhaitez exécuter une commande de votre historique précédent, mais que vous ne souhaitez pas la retaper ? Utilisez ! avant le numéro de commande à réexécuter.
opensource.com
Les commandes de base peuvent améliorer votre expertise en matière de dépannage lorsque vous déterminez pourquoi votre application fonctionne dans un environnement de développement mais peut-être pas dans un autre. De nombreux administrateurs système exploitent ces commandes pour déboguer les problèmes liés aux systèmes. Comprendre certaines de ces commandes de dépannage utiles peut vous aider à communiquer avec les administrateurs système et à résoudre les problèmes liés à votre application.
Cet article a été initialement publié en juillet 2017 et a été mis à jour par l'éditeur.