web-dev-qa-db-fra.com

Est-il possible de savoir quel programme ou script a créé un fichier donné?

Trois fichiers ont soudainement apparu dans mon répertoire domestique, appelé "client_state.xml", "Lockfile" et "Time_Stats_Log". Les deux derniers sont vides. Je me demande comment ils sont arrivés là-bas. Ce n'est pas la première fois que cela s'est passé, mais la dernière fois il y a des semaines; J'ai supprimé les fichiers et rien ne s'est cassé ou plaint. Je n'ai pas pu penser à ce que je faisais à l'époque rapporté par stat $filename. Y a-t-il des moyens de savoir d'où ils viennent?

Alternativement, y a-t-il un moyen de surveiller le répertoire de base (mais pas des sous-répertoires) pour la création de fichiers?

36
Wolf

Je ne crois pas qu'il existe un moyen de déterminer quel programme a créé un fichier.

Pour votre question alternative: vous montre Surveillez le fichier à recréer, cependant, en utilisant inotify. inotifywait est une interface de ligne de commande pour le sous-système inotify; Vous pouvez le dire à rechercher create événements dans votre annuaire de domicile:

$ (sleep 5; touch ~/making-a-test-file) &
[1] 22526

$ inotifywait -e create ~/
Setting up watches.
Watches established.
/home/mmrozek/ CREATE making-a-test-file

Vous voulez probablement le courir avec -m (moniteur), qui lui dit de ne pas quitter après qu'il voit le premier événement

18
Michael Mrozek

Vous pouvez regarder tout ce qui se passe sur un système de fichiers en y accédant sur LogNeDFS . Ceci est un système de fichiers empilés qui enregistre chaque accès dans un arborescence de répertoire.

loggedfs -l /var/tmp/$USER-home-fs.log ~

L'enregistrement de votre répertoire de maison entier pourrait bien ralentir votre système. Vous voudrez au moins écrire un fichier de configuration avec des filtres stricts.

Si vous avez un accès root, sur Linux, vous pouvez utiliser le Subsystème d'audit pour enregistrer un grand nombre de choses, y compris les accès au système de fichiers. Assurez-vous que le Daemon auditd est démarré, puis configurez ce que vous souhaitez vous connecter auditctl . Chaque opération enregistrée est enregistrée dans /var/log/audit/audit.log (sur les distributions typiques). Pour commencer à regarder un fichier particulier:

auditctl -w /path/to/file

ou dans la forme longue

auditctl -a exit,always -F path=/path/to/file

Si vous mettez une montre sur un répertoire (avec -w ou -F dir=), les fichiers de celui-ci et ses sous-répertoires récursives sont également surveillés.

Vous voudrez peut-être jeter un oeil à auditd, ce paquet vous permet de faire des audit de la sécurité et d'obtenir beaucoup d'informations sur qui a changé quoi dans le système de fichiers.

4
lutzky

Je sais que c'est une vieille question, mais je vais suggérer une autre approche au cas où quelqu'un le trouve utile. Je l'ai initialement posté comme une réponse à une question qui a été dupé à celle-ci.

Une option est d'utiliser sysdig: une application de surveillance du système open source. En utilisant, vous pouvez surveiller l'activité sur un fichier par nom. Supposons que vous souhaitiez voir quel processus créait un fichier nommé /tmp/example.txt:

# sysdig fd.name=/tmp/example.txt
567335 16:18:39.654437223 0 touch (5470) < openat fd=3(<f>/tmp/example.txt) dirfd=-100(AT_FDCWD) name=/tmp/example.txt flags=70(O_NONBLOCK|O_CREAT|O_WRONLY) mode=0666
567336 16:18:39.654438248 0 touch (5470) > dup fd=3(<f>/tmp/example.txt)
567337 16:18:39.654438592 0 touch (5470) < dup res=0(<f>/tmp/example.txt)
567338 16:18:39.654439629 0 touch (5470) > close fd=3(<f>/tmp/example.txt)
567339 16:18:39.654439764 0 touch (5470) < close res=0
567342 16:18:39.654441958 0 touch (5470) > close fd=0(<f>/tmp/example.txt)
567343 16:18:39.654442111 0 touch (5470) < close res=0

À partir de cette sortie, vous pouvez voir qu'un processus nommé touch avec PID 5470 a ouvert le fichier.

Si vous souhaitez plus d'informations, vous pouvez exécuter "mode capture" dans lequel une trace d'appel système est collectée:

# sysdig -w /tmp/dumpfile.scap

Ensuite, attendez que le fichier soit créé, puis arrêtez sysdig et exécutez:

# csysdig -r /tmp/dumpfile.scap

Cela vous laissera explorer tout ce qui s'est passé. Vous pouvez appuyer sur <F2> et sélectionnez Files, la presse <F4> Pour rechercher le nom de fichier, puis appuyez sur <F6> à "DIG" (qui vous montrera la sortie similaire à la commande ci-dessus). Avec cela, vous pouvez ensuite utiliser la même approche pour trouver des informations sur le processus qui a créé le fichier.

Il y a une version d'interface graphique de csysdig appelé sysdig-inspect, si c'est plus votre tasse de thé.

4
Andy Dalton

Vous n'avez pas inotify afin que vous puissiez écrire un script qui vérifie le fichier dans une boucle:

#!/bin/sh

while [ true ]; do                     # Run for as long as nessesary
  if [ -f /path/to/file ]; then        # If fileexists
    echo "Found file"                  # Notify and stop monitoring
    exit 0
  fi
  sleep 5                             # Else wait 5 secs
done
2
dogbane