È possibile scoprire quale programma o script ha creato un determinato file?


35

Tre file sono comparsi improvvisamente nella mia directory home, chiamati "client_state.xml", "lockfile" e "time_stats_log". Gli ultimi due sono vuoti. Mi chiedo come siano arrivati ​​lì. Non è la prima volta che succede, ma l'ultima volta è stata settimane fa; Ho cancellato i file e nulla si è rotto o lamentato. Non sono stato in grado di pensare a quello che stavo facendo al momento segnalato da stat $filename. C'è un modo in cui posso scoprire da dove vengono?

In alternativa, c'è un modo per monitorare la home directory (ma non le sottodirectory) per la creazione di file?


Dal momento che sono sicuro che qualcuno lo menzionerà, non ho inotificato.
Lupo,

Risposte:


18

Non credo che ci sia un modo per determinare quale programma ha creato un file.

Per la tua domanda alternativa: puoi guardare per ricreare il file, usando inotify. inotifywaitè un'interfaccia a riga di comando per il inotifysottosistema; puoi dirlo per cercare createeventi nella tua home directory:

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

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

Probabilmente vuoi eseguirlo con -m(monitor), che gli dice di non uscire dopo aver visto il primo evento


Come ottengo inotify? Non è installato (kernel 2.6.34) e non c'è /dev/inotify.
Lupo,

1
@Lupo Che distro? Se compili il tuo kernel, è CONFIG_INOTIFY_USER( Filesystems-> Inotify support for userspace). inotifywaitè probabilmente in un pacchetto chiamato qualcosa del genereinotify-tools
Michael Mrozek

@Michael, è openSUSE 11.3. Non ho mai creato un kernel; uso Linux da circa 5 mesi ed è un concetto un po 'scoraggiante. Ma cercherò un tutorial o qualcosa del genere.
Lupo,

@Wolf Beh, la risposta di dogbane potrebbe essere più semplice se il kernel che hai non viene con esso
Michael Mrozek

2
@Michael In realtà, dopo un po 'più di ricerca e ricerca, ho aggiunto un repository della comunità che, a quanto pare, contiene il inotify-toolspacchetto, quindi ora ho inotifywait(e inotifywatch). L'ho provato e sembra funzionare.
Lupo,

22

Puoi guardare tutto ciò che accade su un filesystem accedendo tramite LoggedFS . Questo è un filesystem in pila che registra ogni accesso in un albero di directory.

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

La registrazione dell'intera directory home potrebbe tuttavia rallentare il sistema. Almeno vorrai scrivere un file di configurazione con filtri rigorosi.

Se si dispone dell'accesso root, su Linux, è possibile utilizzare il sottosistema di controllo per registrare un gran numero di cose, inclusi gli accessi al filesystem. Assicurati che il auditddemone sia avviato, quindi configura ciò con cui vuoi accedere auditctl. Ogni operazione registrata viene registrata in /var/log/audit/audit.log(su distribuzioni tipiche). Per iniziare a guardare un determinato file:

auditctl -w /path/to/file

o nella forma lunga

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

Se si mette un watch in una directory (con -wo -F dir=), anche i file in essa contenuti e le sue sottodirectory ricorsivamente vengono guardati.


BSD supporta anche questo tramite Security Event Auditing. freebsd.org/doc/en_US.ISO8859-1/books/handbook/audit.html
Shawn J. Goff,

4

Potresti dare un'occhiata auditd, questo pacchetto ti permette di fare controlli di sicurezza e ottenere molte informazioni su chi ha cambiato cosa nel filesystem.


se si dispone di un server che fornisce l'accesso alla shell per più utenti e è necessario fornire un certo livello di responsabilità per le singole azioni, è possibile creare determinate shell (come bash e tcsh) con la registrazione della cronologia dei comandi. Ho scritto un post sul blog su come accedere alle shell su < timkennedy.net/2010/12/07/… >. La registrazione della shell non sostituisce un vero sistema di controllo, in quanto non registra i comandi eseguiti da shell non interattive (come script o programmi). Per ottenere quel tipo di granularità hai davvero bisogno di una buona soluzione di auditing.
Tim Kennedy,

1
@TimKennedy - il tuo post sul blog non viene più pubblicato.
slm

1
Scusate. il sito è stato violato ed è rimasto inattivo per un po '. nuova pagina è su timkennedy.net/2010/12/logging-shell-commands-to-syslog-on.html
Tim Kennedy

3

So che questa è una vecchia domanda, ma suggerirò un altro approccio nel caso in cui qualcuno lo trovi utile. Originariamente ho pubblicato questo come una risposta a una domanda che è stata ingannata a questo.

Un'opzione è utilizzare sysdig: un'applicazione di monitoraggio del sistema open source. Usandolo, puoi monitorare l'attività su un file per nome. Supponiamo che tu volessi vedere quale processo stava creando un file chiamato /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

Da quell'output, puoi vedere che un processo chiamato touchcon pid 5470 ha aperto il file.

Se si desidera ulteriori informazioni, è possibile eseguire in "modalità di acquisizione" in cui viene raccolta una traccia di chiamata di sistema:

# sysdig -w /tmp/dumpfile.scap

Quindi attendere la creazione del file, quindi arrestare sysdiged eseguire:

# csysdig -r /tmp/dumpfile.scap

Questo ti permetterà di esplorare tutto quello che è successo. È possibile premere <F2>e selezionare Files, premere <F4>per cercare il nome file, quindi premere <F6>per "scavare" (che mostrerà l'output simile al comando sopra). Con ciò, è quindi possibile utilizzare lo stesso approccio per trovare informazioni sul processo che ha effettivamente creato il file.

C'è una versione GUI di csysdigchiamato sysdig-inspect, se è più la tua tazza di tè.


o forse un loop occupato che esegue costantemente lsof cercando di vedere se / quando un processo sta scrivendo su quel file ... unix.stackexchange.com/a/13782/8337
rogerdpack

2

Non hai, inotifyquindi puoi scrivere uno script che controlla il file in un ciclo:

#!/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
Questo non mostra quale programma l'ha creato
OverCoder il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.