Commandes avancées pour utilisateurs Linux¶
Les commandes avancées offrent une plus grande personnalisation et des contrôles dans des situations plus spécifiques une fois que vous êtes familiarisés avec les commandes de base.
Objectifs : Dans ce chapitre, les futurs administrateurs Linux vont apprendre :
quelques commandes utiles non couvertes dans le chapitre précédent ;
quelques commandes avancées.
commandes utilisateurs, Linux
Connaissances : **
Complexité : **
Temps de lecture : 20 minutes
La commande uniq
¶
La commande uniq
est une commande, utilisée avec la commande sort
, très puissante, notamment pour l’analyse de fichiers de logs. Elle permet de trier et d’afficher des entrées en supprimant les doublons.
Pour illustrer le fonctionnement de la commande uniq
, utilisons un fichier firstnames.txt
contenant une liste de prénoms :
antoine
xavier
steven
patrick
xavier
antoine
antoine
steven
Note
uniq
nécessite que le fichier d'entrée soit trié car il ne compare que des lignes consécutives.
Sans argument, la commande uniq
ne va pas afficher les lignes identiques qui se suivent du fichier firstnames.txt
:
$ sort firstnames.txt | uniq
antoine
patrick
steven
xavier
Pour n’afficher que les lignes n’apparaissant qu’une seule fois, il faut utiliser l’option -u
:
$ sort firstnames.txt | uniq -u
patrick
À l’inverse, pour n’afficher que les lignes apparaissant au moins deux fois dans le fichier, il faut utiliser l’option -d
:
$ sort firstnames.txt | uniq -d
antoine
steven
xavier
Pour simplement supprimer les lignes qui n’apparaissent qu’une seule fois, il faut utiliser l’option -D
:
$ sort firstnames.txt | uniq -D
antoine
antoine
antoine
steven
steven
xavier
xavier
Enfin, pour compter le nombre d’occurrences de chaque ligne, il faut utiliser l’option -c
:
$ sort firstnames.txt | uniq -c
3 antoine
1 patrick
2 steven
2 xavier
$ sort firstnames.txt | uniq -cd
3 antoine
2 steven
2 xavier
La commande xargs
¶
La commande xargs
permet la construction et l’exécution de lignes de commandes à partir de l’entrée standard.
La commande xargs
lit des arguments délimités par des blancs ou par des sauts de ligne depuis l’entrée standard, et exécute une ou plusieurs fois la commande (/bin/echo
par défaut) en utilisant les arguments initiaux suivis des arguments lus depuis l’entrée standard.
Un premier exemple le plus simple possible serait le suivant :
$ xargs
use
of
xargs
<CTRL+D>
use of xargs
La commande xargs
attend une saisie depuis l’entrée standard stdin. Trois lignes sont saisies. La fin de la saisie utilisateur est spécifiée à xargs
par la séquence de touches Ctrl+D. xargs
exécute alors la commande par défaut echo
suivi des trois arguments correspondants à la saisie utilisateur, soit :
$ echo "use" "of" "xargs"
use of xargs
Il est possible de spécifier une commande à lancer par xargs
.
Dans l’exemple qui suit, xargs
va exécuter la commande ls -ld
sur l’ensemble des dossiers qui seront spécifiés depuis l’entrée standard :
$ xargs ls -ld
/home
/tmp
/root
<CTRL+D>
drwxr-xr-x. 9 root root 4096 5 avril 11:10 /home
dr-xr-x---. 2 root root 4096 5 avril 15:52 /root
drwxrwxrwt. 3 root root 4096 6 avril 10:25 /tmp
En pratique, la commande xargs
a exécuté la commande ls -ld /home /tmp /root
.
Que se passe-t-il si la commande à exécuter n’accepte pas plusieurs arguments comme c’est le cas pour la commande find
?
$ xargs find /var/log -name
*.old
*.log
find: paths must precede expression: *.log
La commande xargs
a tenté d’exécuter la commande find
avec plusieurs arguments derrière l’option -name
, ce qui fait généré par find
une erreur :
$ find /var/log -name "*.old" "*.log"
find: paths must precede expression: *.log
Dans ce cas, il faut forcer la commande xargs
à exécuter plusieurs fois (une fois par ligne saisie en entrée standard) la commande find
. L’option -L
suivie d’un nombre entier permet de spécifier le nombre maximal d’entrées à traiter avec la commande en une seule fois :
$ xargs -L 1 find /var/log -name
*.old
/var/log/dmesg.old
*.log
/var/log/boot.log
/var/log/anaconda.yum.log
/var/log/anaconda.storage.log
/var/log/anaconda.log
/var/log/yum.log
/var/log/audit/audit.log
/var/log/anaconda.ifcfg.log
/var/log/dracut.log
/var/log/anaconda.program.log
<CTRL+D>
Si nous avions voulu pouvoir spécifier sur la même ligne les deux arguments, il aurait fallut utiliser l’option -n 1
:
$ xargs -n 1 find /var/log -name
*.old *.log
/var/log/dmesg.old
/var/log/boot.log
/var/log/anaconda.yum.log
/var/log/anaconda.storage.log
/var/log/anaconda.log
/var/log/yum.log
/var/log/audit/audit.log
/var/log/anaconda.ifcfg.log
/var/log/dracut.log
/var/log/anaconda.program.log
<CTRL+D>
Cas concret d’une sauvegarde avec un tar
en fonction d’une recherche :
$ find /var/log/ -name "*.log" -mtime -1 | xargs tar cvfP /root/log.tar
$ tar tvfP /root/log.tar
-rw-r--r-- root/root 1720 2017-04-05 15:43 /var/log/boot.log
-rw-r--r-- root/root 499270 2017-04-06 11:01 /var/log/audit/audit.log
La particularité de la commande xargs
est qu'elle place l’argument en entrée à la fin de la commande appelée. Ceci fonctionne très bien avec l’exemple ci-dessus puisque les fichiers passés en entrée vont constituer la liste des fichiers à ajouter à l’archive.
Maintenant, si nous prenons l’exemple de la commande cp
en voulant copier une liste de fichiers dans un répertoire, cette liste de fichiers sera ajoutée en fin de commande… or ce qui est attendu par la commande cp
en fin de commande est plutôt la destination. Pour ce faire, nous utilisons l’option -I
afin de placer les arguments en entrée ailleurs qu’en fin de ligne.
find /var/log -type f -name "*.log" | xargs -I % cp % /root/backup
L’option -I
permet de spécifier un caractère (dans notre exemple le caractère %
) où seront placés les fichiers en entrée de xargs
.
Le paquet yum-utils
¶
Le paquet yum-utils
est une collection d’utilitaires de différents auteurs pour yum
, qui le rendent plus simple et plus puissant à utiliser.
Note
Bien que yum
ait été remplacé par dnf
dans Rocky Linux 8, le nom du paquet est resté yum-utils
mais il peut tout aussi bien être installé avec le paquet dnf-utils
. Ce sont des utilitaires YUM classiques implémentés comme des CLI au-dessus de DNF pour maintenir une compatibilité ascendante avec yum-3
.
Voici quelques exemples parmi ces utilitaires.
la commande repoquery
¶
La commande repoquery
est utilisée pour rechercher les paquets dans le dépôt.
Exemples d’utilisation :
- Affiche les dépendances d'un paquet (il peut s'agir d'un paquet logiciel qui a été installé ou non), équivalent à
dnf deplist <package-name>
repoquery --requires <package-name>
- Affiche les fichiers fournis par un paquet installé (ne fonctionne pas pour les paquets qui ne sont pas installés), équivalent à
rpm -ql <package-name>
$ repoquery -l yum-utils
/etc/bash_completion.d
/etc/bash_completion.d/yum-utils.bash
/usr/bin/debuginfo-install
/usr/bin/find-repos-of-install
/usr/bin/needs-restarting
/usr/bin/package-cleanup
/usr/bin/repo-graph
/usr/bin/repo-rss
/usr/bin/repoclosure
/usr/bin/repodiff
/usr/bin/repomanage
/usr/bin/repoquery
/usr/bin/reposync
/usr/bin/repotrack
/usr/bin/show-changed-rco
/usr/bin/show-installed
/usr/bin/verifytree
/usr/bin/yum-builddep
/usr/bin/yum-config-manager
/usr/bin/yum-debug-dump
/usr/bin/yum-debug-restore
/usr/bin/yum-groups-manager
/usr/bin/yumdownloader
…
La commande yumdownloader
¶
La commande yumdownloader
télécharge les paquets RPM depuis les dépôts. Équivalent à dnf download --downloadonly --downloaddir ./ package-name
Note
Cette commande est très pratique pour construire un dépôt local de quelques rpms !
Exemple : yumdownloader
va télécharger le paquet rpm de samba ainsi que toutes ses dépendances :
$ yumdownloader --destdir /var/tmp --resolve samba
ou bien
$ dnf download --downloadonly --downloaddir /var/tmp --resolve samba
Options | Commentaires |
---|---|
--destdir |
Les paquets téléchargés seront conservés dans le dossier spécifié. |
--resolve |
Télécharge également les dépendances du paquet. |
Le paquet psmisc
¶
Le paquet psmisc
contient des utilitaires pour gérer les processus du système :
pstree
: la commandepstree
affiche les processus en cours sur le système sous forme de structure en forme d’arbre.killall
: la commandekillall
envoie un signal d’extinction à tous les processus identifiés par un nom.fuser
: la commandefuser
identifie lesPID
des processus qui utilisent les fichiers ou les systèmes de fichiers spécifiés.
Exemples :
$ pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─agetty
├─auditd───{auditd}
├─crond
├─dbus-daemon───{dbus-daemon}
├─firewalld───{firewalld}
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─polkitd───5*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd───sshd───bash───pstree
├─systemd-journal
├─systemd-logind
├─systemd-udevd
└─tuned───4*[{tuned}]
# killall httpd
Tue les processus (option -k
) qui accèdent au fichier /etc/httpd/conf/httpd.conf
:
# fuser -k /etc/httpd/conf/httpd.conf
La commande watch
¶
La commande watch
exécute régulièrement une commande et affiche le résultat dans le terminal en plein écran.
L’option -n
permet de spécifier le nombre de secondes entre chaque exécution de la commande.
Note
Pour quitter la commande watch
, vous devez appuyer sur les touches : CTRL+C pour terminer le processus.
Exemples :
- Afficher la fin du fichier
/etc/passwd
toutes les 5 secondes :
watch -n 5 tail -n 3 /etc/passwd
Résultat :
Every 5.0s: tail -n 3 /etc/passwd rockstar.rockylinux.lan: Thu Jul 1 15:43:59 2021
sssd:x:996:993:User for sssd:/:/sbin/nologin
chrony:x:995:992::/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
- Surveiller le nombre de fichier dans un dossier :
watch -n 1 'ls -l | wc -l'
- Afficher une horloge :
watch -t -n 1 date
La commande install
¶
Contrairement à ce que le nom pourrait suggérer, la commande install
n'est pas utilisée pour installer des paquets.
La commande associe la copie de fichiers (cp
) et la création de dossiers (mkdir
), ainsi que la gestion des accès (chmod
, chown
) et autres fonctionalités utiles (comme les sauvegardes).
install source dest
install -t directory source [...]
install -d directory
Options :
Option | Description |
---|---|
-b ou bien --backup[=suffix] |
créer une sauvegarde du fichier destinataire |
-d |
traiter les arguments comme des noms de dossiers |
-D |
créer tous les composants principaux, avant de copier SOURCE vers DEST |
-g et -o |
définir l'appertenance |
-m |
définir les permissions |
-p |
préserve la date et l'heure des fichiers sources |
-t |
copie tous les arguments sources vers le dossier |
Remarque
Il existe aussi des options pour gérer le contexte de SELinux (cf. man install).
Exemples :
Créer un dossier à l'aide de l'option -d
:
install -d ~/samples
Copier un fichier source vers un dossier :
install src/sample.txt ~/samples/
Ces deux actions peuvent être réduites à une seule commande :
$ install -v -D -t ~/samples/ src/sample.txt
install: creating directory '~/samples'
'src/sample.txt' -> '~/samples/sample.txt'
Cette commande permet déjà un gain de temps. Combinez-le avec propriétaire, groupe propriétaire et la gestion des droits pour optimiser le gain de temps :
sudo install -v -o rocky -g users -m 644 -D -t ~/samples/ src/sample.txt
Remarque
Dans ce cas sudo
est nécessaire pour modifier les propriétés.
Vous pouvez aussi créer une sauvegarde des fichiers existants grâce à l'option -b
:
$ install -v -b -D -t ~/samples/ src/sample.txt
'src/sample.txt' -> '~/samples/sample.txt' (archive: '~/samples/sample.txt~')
Comme vous pouvez le constater, la commande install
permet de créer une sauvegarde en ajoutant un tilde ~
au nom original du fichier.
Le suffixe peut être spécifié grâce à l'option -S
:
$ install -v -b -S ".bak" -D -t ~/samples/ src/sample.txt
'src/sample.txt' -> '~/samples/sample.txt' (archive: '~/samples/sample.txt.bak')
La commande tree
¶
Affiche les fichiers ou dossiers du répertoire dans une structure arborescente.
Options | Description |
---|---|
-a |
Tous les fichiers sont affichés |
-h |
Affiche la taille d'une façon plus lisible |
-u |
Affiche le propriétaire ou bien l'UID |
-g |
Affiche le groupe propriétaire ou bien le GID |
-p |
Affiche les protections de chaque fichier |
Par exemple :
$ tree -hugp /etc/yum.repos.d/
/etc/yum.repos.d/
├── [-rw-r--r-- root root 1.6K] epel-modular.repo
├── [-rw-r--r-- root root 1.3K] epel.repo
├── [-rw-r--r-- root root 1.7K] epel-testing-modular.repo
├── [-rw-r--r-- root root 1.4K] epel-testing.repo
├── [-rw-r--r-- root root 710] Rocky-AppStream.repo
├── [-rw-r--r-- root root 695] Rocky-BaseOS.repo
├── [-rw-r--r-- root root 1.7K] Rocky-Debuginfo.repo
├── [-rw-r--r-- root root 360] Rocky-Devel.repo
├── [-rw-r--r-- root root 695] Rocky-Extras.repo
├── [-rw-r--r-- root root 731] Rocky-HighAvailability.repo
├── [-rw-r--r-- root root 680] Rocky-Media.repo
├── [-rw-r--r-- root root 680] Rocky-NFV.repo
├── [-rw-r--r-- root root 690] Rocky-Plus.repo
├── [-rw-r--r-- root root 715] Rocky-PowerTools.repo
├── [-rw-r--r-- root root 746] Rocky-ResilientStorage.repo
├── [-rw-r--r-- root root 681] Rocky-RT.repo
└── [-rw-r--r-- root root 2.3K] Rocky-Sources.repo
0 directories, 17 files
La commande stat
¶
La commande stat
affiche l'état d'un fichier ou système de fichiers.
$ stat /root/anaconda-ks.cfg
File: /root/anaconda-ks.cfg
Size: 1352 Blocks: 8 IO Block: 4096 regular file
Device: 10302h/66306d Inode: 2757097 Links: 1
Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2024-01-20 13:04:57.012033583 +0800
Modify: 2023-09-25 14:04:48.524760784 +0800
Change: 2024-01-24 16:37:34.315995221 +0800
Birth: 2
File
- Affiche le chemin du fichier.Size
- Affiche la taille du fichier en octets. Dans le cas d'un répertoire, affiche une taille fixe de 4096 octets correspondant à l'enregistrement du nom de dossier.Blocks
- Affiche le nombre de blocs alloués. Attention s'il vous plaît ! La taille de chaque bloc dans cette commande est de 512 octets. La taille par défault de chaque bloc dans la commandels -ls
est de 1024 octets.Device
- Numéro de périphérique en décimal ou bien hexadécimal.Inode
- Numéro d'Inode unique assigné par le noyau Linux au fichier ou dossier.Links
- Nombre de liens physiques. Les liens directs sont parfois appelés liens physiques.Access
: L'heure du dernier accès aux fichiers et répertoires, c'est-à-direatime
dans GNU/Linux.Modify
: la date à laquelle les fichiers et répertoires ont été modifiés pour la dernière fois, c'est-à-diremtime
dans GNU/Linux.Change
: la date à laquelle la propriété a été modifiée pour la dernière fois, c'est-à-directime
dans GNU/Linux.Birth
- Date d'origine (date et heure de création). Dans certains documents, il est abrégé parbtime
oucrtime
. Pour afficher la date de création, la version du système de fichiers et du noyau doit être supérieure à une certaine version.
Concernant les fichiers :
atime : Après avoir accédé au contenu du fichier avec des commandes telles que cat
, less
, more
et head
, le atime
du fichier peut être mis à jour. Veuillez prêter attention ! Le atime
du fichier n'est pas mis à jour en temps réel et doit, pour des raisons de performances, attendre un certain temps avant de pouvoir être visualisé. mtime : la modification du contenu du fichier peut mettre à jour le mtime
du fichier (identique à l'ajout ou à l'écrasement du contenu du fichier via la redirection) ; puisque la taille du fichier est une propriété du fichier, le ctime
du fichier sera également mis à jour simultanément. ctime : la modification du propriétaire, du groupe, des autorisations, de la taille du fichier et des liens (liens logiciels et physiques) du fichier mettra à jour ctime
.
Concernant les dossiers :
atime : après avoir utilisé la commande cd
pour entrer dans un nouveau répertoire auquel vous n'avez jamais accédé auparavant, vous pouvez mettre à jour et corriger le atime
de ce répertoire. mtime : effectuer des opérations telles que créer, supprimer et renommer des fichiers dans ce répertoire mettra à jour le mtime
et le ctime
du répertoire. ctime : lorsque les autorisations, le propriétaire, le groupe, etc. d'un répertoire changent, le ctime
du répertoire est mis à jour.
Astuce
- Si vous créez un nouveau fichier ou répertoire, ses
atime
,mtime
etctime
sont exactement identiques - Si le contenu du fichier est modifié, les
mtime
etctime
du fichier seront forcément mis à jour. - Si un nouveau fichier est créé dans le répertoire, les valeurs
atime
,ctime
etmtime
du répertoire seront mises à jour simultanément. - Si le
mtime
d'un répertoire est mis à jour, lectime
de ce répertoire doit également être mis à jour.