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

35

Trois fichiers sont soudainement apparus dans mon répertoire personnel, appelés "client_state.xml", "lockfile" et "time_stats_log". Les deux derniers sont vides. Je me demande comment ils sont arrivés là. Ce n'est pas la première fois que cela se produit, mais la dernière fois c'était il y a des semaines; J'ai supprimé les fichiers et rien ne s'est cassé ni ne s'est plaint. Je n'ai pas été capable de penser à ce que je faisais à l'époque rapporté par stat $filename. Y a-t-il un moyen de savoir d'où ils viennent?

Sinon, existe-t-il un moyen de surveiller le répertoire de base (mais pas les sous-répertoires) pour la création de fichiers?

Loup
la source
Depuis que je suis sûr que quelqu'un va en parler, je n'ai pas inotify.
Wolf

Réponses:

18

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

Pour votre question alternative: vous pouvez regarder pour que le fichier soit recréé, en utilisant inotify. inotifywaitest une interface de ligne de commande pour le inotifysous - système; vous pouvez lui indiquer de rechercher des createévénements dans votre répertoire personnel:

$ (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 l'exécuter avec -m(moniteur), ce qui lui dit de ne pas quitter après avoir vu le premier événement

Michael Mrozek
la source
Comment puis-je obtenir inotify? Il n'est pas installé (noyau 2.6.34) et il n'y en a pas /dev/inotify.
Wolf
1
@ Wolf Quelle distribution? Si vous construisez votre propre noyau, c'est CONFIG_INOTIFY_USER( Filesystems-> Inotify support for userspace). inotifywaitest probablement dans un paquet nommé quelque chose commeinotify-tools
Michael Mrozek
@ Michael, c'est openSUSE 11.3. Je n'ai jamais construit de noyau; n’utilise Linux que depuis environ 5 mois et c’est un concept un peu intimidant. Mais je vais chercher un tutoriel ou quelque chose du genre.
Wolf
@Wolf Eh bien, la réponse de dogbane pourrait être plus facile si le noyau que vous avez n’est pas accompagné
Michael Mrozek
2
@ Michael En fait, après un peu plus de chasse et de recherche, j'ai ajouté un référentiel communautaire qui contient le inotify-toolspaquet, donc j'ai maintenant inotifywait(et inotifywatch). Je l'ai testé et cela semble fonctionner.
Wolf
22

Vous pouvez regarder tout ce qui se passe sur un système de fichiers en y accédant via LoggedFS . C'est un système de fichiers empilé qui enregistre chaque accès dans une arborescence de répertoires.

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

La connexion de tout votre répertoire personnel peut toutefois ralentir votre système. Vous voudrez au moins écrire un fichier de configuration avec des filtres rigoureux.

Si vous disposez d'un accès root, sous Linux, vous pouvez utiliser le sous-système d'audit pour enregistrer un grand nombre d'éléments, y compris les accès au système de fichiers. Assurez-vous que le auditddémon est démarré, puis configurez le journal avec lequel vous souhaitez vous connecter auditctl. Chaque opération consignée est enregistrée dans /var/log/audit/audit.log(sur des distributions types). Pour commencer à regarder un fichier particulier:

auditctl -w /path/to/file

ou sous forme longue

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

Si vous surveillez un répertoire (avec -wou -F dir=), les fichiers qu'il contient et ses sous-répertoires de manière récursive sont également surveillés.

Gilles, arrête de faire le mal
la source
BSD le prend également en charge via l'audit des événements de sécurité. freebsd.org/doc/en_US.ISO8859-1/books/handbook/audit.html
Shawn J. Goff Le
4

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

lutzky
la source
Si votre serveur fournit un accès au shell à plusieurs utilisateurs et que vous devez fournir un certain niveau de responsabilité pour des actions individuelles, vous pouvez créer certains shells (tels que bash et tcsh) avec la journalisation de l'historique des commandes. J'ai écrit un article sur la journalisation des coquillages sur le blog < timkennedy.net/2010/12/07/… >. La journalisation de shell ne remplace pas un système d'audit réel, car elle ne consigne pas les commandes exécutées par des shells non interactifs (tels que des scripts ou des programmes). Pour obtenir ce type de granularité, vous avez vraiment besoin d'une bonne solution d'audit.
Tim Kennedy
1
@ TimKennedy - votre billet de blog n'est plus à venir.
slm
1
Désolé. le site a été piraté, et a été en panne pendant un moment. nouvelle page est à timkennedy.net/2010/12/logging-shell-commands-to-syslog-on.html
Tim Kennedy
3

Je sais que c'est une vieille question, mais je suggérerai une autre approche au cas où quelqu'un le jugerait utile. Au départ, je publiais ceci en réponse à une question qui était dupée à celle-ci.

Une option consiste à utiliser sysdig: une application de surveillance du système open-source. En l'utilisant, vous pouvez surveiller l'activité d'un fichier par son nom. Supposons que vous vouliez 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é touchavec pid 5470 a ouvert le fichier.

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

# sysdig -w /tmp/dumpfile.scap

Attendez ensuite que le fichier soit créé, puis arrêtez sysdiget exécutez:

# csysdig -r /tmp/dumpfile.scap

Cela vous permettra d'explorer tout ce qui s'est passé. Vous pouvez appuyer sur <F2>et sélectionner Files, la presse <F4>pour rechercher le nom du fichier, puis appuyer <F6>sur "dig" (qui affichera une 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 réellement créé le fichier.

Il existe une version graphique de csysdigappelée sysdig-inspect, si c'est plus votre tasse de thé.

Andy Dalton
la source
ou peut-être une boucle occupée qui exécute constamment lsof pour savoir si / quand un processus écrit dans ce fichier ... unix.stackexchange.com/a/13782/8337
rogerdpack
2

Vous ne inotifypouvez pas écrire un script qui vérifie le fichier en 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
dogbane
la source
2
Cela ne montre pas quel programme l'a créé
OverCoder