GNU/Linux >> Tutoriels Linux >  >> Debian

Comment déclencher des commandes sur les changements de fichier/répertoire avec Incron sur Debian 8

Ce guide explique comment installer et utiliser incron sur un système Debian 8 (Jessie). Incron est similaire à cron, mais au lieu d'exécuter des commandes en fonction du temps, il peut déclencher des commandes lorsque des événements de fichier ou de répertoire se produisent (par exemple, une modification de fichier, des changements d'autorisations, etc.).

1 Prérequis

  • Autorisations d'administrateur système (connexion root). Toutes les commandes de ce didacticiel doivent être exécutées en tant qu'utilisateur root sur le Shell.
  • J'utiliserai l'éditeur "nano" pour éditer les fichiers. Vous pouvez remplacer nano par un éditeur de votre choix ou installer nano avec "apt-get install nano" s'il n'est pas installé sur votre serveur.

2 Installer Incron

Incron est disponible dans le dépôt Debian ; nous installons donc incron avec la commande apt suivante :

apt-get install incron

Le processus d'installation devrait être similaire à celui de cette capture d'écran.

 

3 Utiliser Incron

L'utilisation d'incron ressemble beaucoup à l'utilisation de cron. Vous disposez de la commande incrontab qui vous permet de lister (-l), de modifier (-e) et de supprimer (-r) les entrées incrontab.

Pour en savoir plus, consultez :

man incrontab

Vous y trouverez également la section suivante :

Si /etc/incron.allow existe, seuls les utilisateurs répertoriés ici peuvent utiliser incron. Sinon, si /etc/incron.deny existe, seuls les utilisateurs NON répertoriés ici peuvent utiliser incron. Si aucun de ces fichiers n'existe, tout le monde est autorisé à utiliser incron. (Remarque importante :ce comportement n'est pas sécurisé et sera probablement modifié pour être compatible avec le style utilisé par ISC Cron.) L'emplacement de ces fichiers peut être modifié dans la configuration.

Cela signifie que si nous voulons utiliser incrontab en tant que root, nous devons soit supprimer /etc/incron.allow (ce qui n'est pas sûr car alors chaque utilisateur du système peut utiliser incrontab)...

rm -f /etc/incron.allow

... ou ajoutez root à ce fichier (recommandé). Ouvrez le fichier /etc/incron.allow avec nano :

nano /etc/incron.allow

Et ajoutez la ligne suivante. Enregistrez ensuite le fichier.

root

Avant de faire cela, vous obtiendrez des messages d'erreur comme celui-ci lorsque vous essayez d'utiliser incrontab :

server1:~# incrontab -l
user 'root' is not allowed to use incron
server1:~#

Après ça marche :

server1:~# incrontab -l
no table for root
server1:~#

Nous pouvons utiliser la commande :

incrontab -e

Pour créer des tâches incron. Avant de faire cela, nous jetons un coup d'œil à la page de manuel incron :

man 5 incrontab

La page de manuel explique le format des crontabs. Fondamentalement, le format est le suivant...

<path> <mask> <command>

... où peut être un répertoire (ce qui signifie que le répertoire et/ou les fichiers directement dans ce répertoire (et non les fichiers dans les sous-répertoires de ce répertoire !) sont surveillés) ou un fichier.

peut être l'un des éléments suivants :

IN_ACCESS           File was accessed (read) (*)
IN_ATTRIB           Metadata changed (permissions, timestamps, extended attributes, etc.) (*)
IN_CLOSE_WRITE      File opened for writing was closed (*)
IN_CLOSE_NOWRITE    File not opened for writing was closed (*)
IN_CREATE           File/directory created in watched directory (*)
IN_DELETE           File/directory deleted from watched directory (*)
IN_DELETE_SELF           Watched file/directory was itself deleted
IN_MODIFY           File was modified (*)
IN_MOVE_SELF        Watched file/directory was itself moved
IN_MOVED_FROM       File moved out of watched directory (*)
IN_MOVED_TO         File moved into watched directory (*)
IN_OPEN             File was opened (*)

Lors de la surveillance d'un répertoire, les événements marqués d'un astérisque (*) ci-dessus peuvent se produire pour les fichiers du répertoire, auquel cas le champ de nom dans les
données d'événement renvoyées identifie le nom du fichier dans le répertoire.

Le symbole IN_ALL_EVENTS est défini comme un masque binaire de tous les événements ci-dessus. Deux symboles de commodité supplémentaires sont IN_MOVE, qui est une combinaison de IN_MOVED_FROM et IN_MOVED_TO, et IN_CLOSE qui combine IN_CLOSE_WRITE et IN_CLOSE_NOWRITE.

Les autres symboles suivants peuvent être spécifiés dans le masque :

IN_DONT_FOLLOW      Don't dereference pathname if it is a symbolic link
IN_ONESHOT          Monitor pathname for only one event
IN_ONLYDIR          Only watch pathname if it is a directory

De plus, il existe un symbole qui n'apparaît pas dans le jeu de symboles inotify. C'est IN_NO_LOOP. Ce symbole désactive la surveillance des événements jusqu'à ce que l'événement en cours soit complètement géré (jusqu'à ce que son processus enfant se termine).

est la commande qui doit être exécutée lorsque l'événement se produit. Les jokers suivants peuvent être utilisés dans la spécification de la commande :

$$   dollar sign
[email protected]   watched filesystem path (see above)
$#   event-related file name
$%   event flags (textually)
$&   event flags (numerically)

Si vous surveillez un répertoire, alors [email protected] contient le chemin du répertoire et $# le fichier qui a déclenché l'événement. Si vous regardez un fichier, alors [email protected] contient le chemin d'accès complet au fichier et $# est vide.

Si vous avez besoin des caractères génériques mais que vous n'êtes pas sûr de leur traduction, vous pouvez créer une tâche incron comme celle-ci. Ouvrez l'incron incrontab :

incrontab -e

et ajoutez la ligne suivante :

/tmp/ IN_MODIFY echo "$$ [email protected] $# $% $&"

Ensuite, vous créez ou modifiez un fichier dans le répertoire /tmp et jetez un œil à /var/log/syslog - ce journal indique quand une tâche incron a été déclenchée, si elle a réussi ou s'il y a eu des erreurs, et quelle était la commande réelle. il s'est exécuté (c'est-à-dire que les caractères génériques sont remplacés par leurs valeurs réelles).

tail /var/log/syslog
...
Sep 16 10:14:35 server1 incrond[1199]: (root) CMD (echo "$ /tmp .hello.txt.swp IN_MODIFY 2")
Sep 16 10:14:36 server1 incrond[1199]: (root) CMD (echo "$ /tmp .hello.txt.swp IN_MODIFY 2")
Sep 16 10:14:39 server1 incrond[1199]: (root) CMD (echo "$ /tmp hello.txt IN_MODIFY 2")
Sep 16 10:14:39 server1 incrond[1199]: (root) CMD (echo "$ /tmp .hello.txt.swp IN_MODIFY 2")

Dans cet exemple, j'ai édité le fichier /tmp/hello.txt; comme vous le voyez [email protected] se traduit par /tmp, $# par hello.txt , $% à IN_CREATE et $&à 256. J'ai utilisé un éditeur qui a créé un fichier .txt.swp temporaire qui se traduit par des lignes supplémentaires dans syslog.

Maintenant assez de théorie. Créons nos premières tâches incron. J'aimerais surveiller le fichier /etc/apache2/apache2.conf et le répertoire /etc/apache2/vhosts/, et chaque fois qu'il y a des changements, je veux qu'incron redémarre Apache. Voici comment nous procédons :

incrontab -e
/etc/apache2/apache2.conf IN_MODIFY /usr/sbin/service apache2 restart
/etc/apache2/sites-available/ IN_MODIFY /usr/sbin/service apache2 restart

C'est ça. À des fins de test, vous pouvez modifier votre configuration Apache et jeter un œil à /var/log/syslog, et vous devriez voir qu'incron redémarre Apache.

REMARQUE :N'effectuez aucune action à partir d'une tâche incron dans un répertoire que vous surveillez pour éviter les boucles. Exemple : Lorsque vous surveillez le répertoire /tmp pour les modifications et que chaque modification déclenche un script qui écrit un fichier journal dans /tmp, cela provoquera une boucle et pourrait amener votre système à une charge élevée ou même le planter.

Pour lister toutes les tâches incron définies, vous pouvez exécuter :

incrontab -l
server1:~# incrontab -l
/etc/apache2/apache2.conf IN_MODIFY /usr/sbin/service apache2 restart
/etc/apache2/vhosts/ IN_MODIFY /usr/sbin/service apache2 restart
server1:~#

Pour supprimer toutes les tâches incron de l'utilisateur actuel, exécutez :

incrontab -r
server1:~# incrontab -r
removing table for user 'root'
table for user 'root' successfully removed
server1:~#

  • Debian http://www.debian.org
  • incron :http://inotify.aiken.cz/?section=incron&page=about&lang=en

Debian
  1. Comment chiffrer le répertoire avec EncFS sur Debian 9 Stretch Linux

  2. Déclencher des commandes sur les modifications de fichiers/répertoires avec Incron sur Debian Etch

  3. Comment configurer un site Web de partage de fichiers avec Jirafeau sur Debian 10

  4. Comment exécuter des commandes sur les changements de fichier ou de répertoire avec Incron sur Ubuntu

  5. Comment analyser un serveur Debian à la recherche de rootkits avec Rkhunter

Comment lire un fichier avec des espaces sous Linux

Comment trouver des fichiers dans Debian 10

Comment manipuler des fichiers sur Debian 11

Comment éditer le fichier hosts sur Debian

Comment réparer les erreurs du système de fichiers dans Debian

Comment démarrer le fichier ISO Debian à partir du disque dur avec GRUB2