20 commandes Linux que chaque administrateur système devrait connaître

Dans un monde regorgeant de nouveaux outils et d’environnements de développement divers, il est pratiquement nécessaire pour tout développeur ou ingénieur d’apprendre certaines commandes de base de l’administrateur système. Des commandes et packages spécifiques peuvent aider les développeurs à organiser, dépanner et optimiser leurs applications et, lorsque les choses tournent mal, fournir des informations de triage 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 sysadmin 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 résoudre les raisons pour lesquelles 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 et au bare metal.

curl

curl transfère une URL. Utilisez cette commande pour tester le point de terminaison ou la connectivité d’une application à un point de terminaison de service en amont. curl peut être utile pour déterminer si votre application peut atteindre un autre service, comme une base de données, ou pour vérifier si votre service est en bonne santé.

À titre d’exemple, imaginez que votre application génère 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 à partir de 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’atteindre la base de données à partir de l’hôte de l’application. Votre application utilise le nom d’hôte de la base de données, essayez donc 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 que l’hôte (conteneur ou machine virtuelle) n’a pas de serveur de noms qu’il peut utiliser pour résoudre le nom d’hôte.

python-m json.tool/jq

Après avoir émis curl, la sortie de l’appel d’API peut être difficile à lire. Parfois, vous voulez imprimer la sortie JSON pour trouver une entrée spécifique. Python a une bibliothèque JSON intégrée qui peut aider à cela. Vous utilisez python-m json.outil pour indenter et organiser le JSON. Pour utiliser le module JSON de Python, dirigez la sortie d’un fichier JSON dans le json python-m.commande d’outil.

$ cat test.json
{"title":"Person","type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"age":{"description":"Age in years","type":"integer","minimum":0}},"required":}

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": ,
"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 assez 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":
}

ls

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 vous 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 autorisations à l’aide de ls-l, vous vous rendez compte que les autorisations n’ont pas de « x » dans -rw-rrr–, qui sont en lecture et en écriture uniquement.

$ ./myapp
bash: ./myapp: Permission denied
$ ls -l myapp
-rw-r--r--. 1 root root 33 Jul 21 18:36 myapp

queue

queue 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 vos journaux disent de la demande la plus récente de votre application. Par exemple, vous pouvez utiliser tail pour vérifier ce qui se passe dans les journaux lorsque vous faites une demande à votre serveur HTTP Apache.

example_tail.png

 Utilisez tail-f pour suivre les journaux du serveur HTTP Apache et voir les requêtes au fur et à mesure.

Utilisez tail-f pour suivre les journaux HTTP Apache et voir les requêtes au fur et à mesure.

L’option -f indique l’option « suivre », qui affiche les lignes de journal telles qu’elles sont écrites dans le fichier. L’exemple a un script d’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

cat

cat concatène et imprime des 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.

grep

grep recherche des 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 canalisant 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 org.apache.catalina.startup.Catalina.start Server startup in 681 ms

ps

La commande ps, qui fait partie du package procps-ng et qui fournit des commandes utiles pour étudier 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 canalisez-le sur grep.

$ ps -ef | grep tomcat
root 1 0 1 18:55 ? 00:00:02 /docker-java-home/jre/bi

env

env vous permet de définir ou d’imprimer les variables d’environnement. Lors du dépannage, il peut être utile de vérifier si la 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.

top

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 la quantité de mémoire et de processeur qu’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 application est-elle vraiment à court de mémoire ? Pour confirmer, utilisez top pour déterminer la quantité de processeur et de mémoire consommée par votre application. Lors de l’émission de top, vous remarquez une application Python utilisant la majeure partie du processeur, avec une utilisation croissante de la mémoire, 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 effectuer une ingénierie inverse si le processus est votre application. Il s’avère être votre application gourmande en mémoire (memeater.py ). Lorsque votre application est à court de mémoire, le système la tue avec une erreur de mémoire insuffisante (OOM).

example_top.png

 Émission de top sur une application qui consomme toute sa mémoire.

L’utilisation de la mémoire et du processeur de l’application augmente, ce qui finit par être tué.

example_topwithc.png

 Appuyer sur C pendant l'exécution de top affiche la commande complète

En appuyant sur la touche « C », vous pouvez voir la commande complète qui a démarré l’application.

En plus de vérifier votre propre application, vous pouvez utiliser top pour déboguer d’autres processus utilisant le processeur ou la mémoire.

netstat

netstat affiche l’état du réseau. Cette commande affiche les ports réseau utilisés et leurs connexions entrantes. Cependant, netstat ne sort pas de la boîte 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 pousse 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 des 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.

example_netstat.png

 netstat vérifie qu'Apache s'exécute sur le port 80

L’utilisation de netstat-tulpn montre qu’Apache utilise déjà le port 80 sur cette machine.

ip

Si l’adresse IP ne fonctionne pas sur votre hôte, elle doit être installée avec le package iproute2. L’adresse de sous-commande (ou simplement ip a pour faire court) 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 simple vérification, vous pouvez toujours utiliser la commande adresse IP pour obtenir l’adresse IP de l’hôte. L’exemple ci-dessous montre que le conteneur de niveau web a 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

lsof

lsof répertorie les fichiers ouverts associés à votre application. Sur certaines images de machines Linux, vous devez installer lsof avec le package lsof. Sous Linux, presque toute interaction avec le système est traitée 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. Similaire à 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).

example_lsof.png

 lsof révèle l'origine des informations de processus

Lsof indique que httpd écoute sur le port 80. L’examen de l’ID de processus de httpd affiche également tous les fichiers dont httpd a besoin pour s’exécuter.

Le nom du fichier ouvert dans la liste des fichiers ouverts permet de localiser l’origine du processus, en particulier Apache.

df

Vous pouvez utiliser df (display free disk space) 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. Alors que l’espace disque doit ê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 n’avez pas vraiment 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 affiche 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 (tel que df-h/home).

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 voulez savoir quel journal occupe le plus d’espace dans le répertoire /var/log, par exemple, vous pouvez utiliser du avec l’option -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 le plus grand répertoire sous /var/log à être /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.

id

Pour vérifier l’utilisateur exécutant 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 remarquez que vous êtes en cours d’exécution 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 offre des privilèges élevés.

chmod

Lorsque vous exécutez votre binaire d’application pour la première fois sur votre hôte, vous pouvez recevoir le message d’erreur « autorisation refusée. »Comme on le voit dans l’exemple pour ls, vous pouvez vérifier les autorisations de votre binaire d’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
$ ls -l
total 4
-rwxrwxr-x. 1 vagrant vagrant 34 Jul 11 02:17 test.sh

Comme démontré dans l’exemple, cela met à jour les autorisations avec les droits d’exécution. Maintenant, lorsque vous essayez d’exécuter votre binaire, l’application ne génère pas d’erreur de refus d’autorisation. Chmod peut également être utile lorsque vous chargez un binaire dans un conteneur. Il garantit que votre conteneur dispose des autorisations correctes pour exécuter votre binaire.

dig/nslookup

Un serveur de noms de domaine (DNS) permet de résoudre une URL vers un ensemble de serveurs d’applications. Cependant, vous pouvez constater 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 tentez d’accéder à votre base de données à l’URL mydatabase à partir de l’hôte de votre application. Au lieu de cela, vous recevez une erreur « impossible de résoudre ». Pour résoudre les problèmes, essayez d’utiliser dig (utilitaire de recherche DNS) ou nslookup (serveurs de noms Internet de requête) pour comprendre pourquoi l’application n’arrive 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 mydatabase 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 pouvez pas déboguer la cause première, contactez votre administrateur système pour plus d’investigation. Pour les tests locaux, ce problème peut indiquer que les serveurs de noms de votre hôte ne sont pas configurés de manière appropriée. Pour utiliser ces commandes, vous devrez installer le package BIND Utilities.

firewall-cmd

Traditionnellement, les pare-feu étaient configurés sous Linux avec la commande iptables, et bien qu’il conserve son ubiquité, il a en fait été largement remplacé par nftables. Un front-end convivial pour nftables, et celui qui est livré avec de nombreuses distributions par défaut, est firewall-cmd. Cette commande vous aide à définir des règles régissant le trafic réseau, à la fois sortant et entrant, autorisé par votre ordinateur. Ces règles peuvent être regroupées en zones, ce qui vous permet de 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, qui sont toutes nommées de manière à vous aider à construire presque une phrase 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 et l’un est affecté à la zone corp, tandis que l’autre est affecté à la zone dmz.

Pour voir ce que chaque zone permet, 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:

Ajouter des services est tout aussi simple:

$ sudo firewall-cmd --add-service http --permanent
$ sudo firewall-cmd --reload

Interagir avec firewall – cmd est conçu pour être intuitif 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 feuille de triche firewall-cmd pour vous aider à mémoriser ses options les plus importantes.

sestatus

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 sans privilège aux processus s’exécutant 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 case 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 SELinux est activé sur l’hôte de l’application. 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 feuille de triche SELinux pour une référence rapide.

historique

Lorsque vous émettez autant de commandes de test et de débogage, vous pouvez oublier celles qui sont 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 se passe-t-il si vous voulez exécuter une commande dans votre historique précédent, mais que vous ne voulez pas la retaper ? Utilisez! avant le numéro de commande à ré-exécuter.

example_history.png

 Réexécutez une commande dans votre historique

Ajouter! avant que le numéro de commande que vous souhaitez exécuter émet à nouveau la commande.

Les commandes de base peuvent améliorer votre expertise en 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 avec les systèmes. La compréhension de 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.



+