Estoy trabajando en un software que requiere que sepa a qué archivos y recursos accede cualquier proceso iniciado.
No planeo intentar rastrear a qué accede cada script, aplicación y demonio, solo un determinado proceso proporcionado por el usuario.
¿Hay alguna forma de hacer esto en Python (o en cualquier otro lenguaje)? Voy a investigar un poco por mi cuenta, solo pensé en preguntar aquí en caso de que haya usuarios expertos que sepan sobre este tipo de cosas y puedan brindar un poco más de explicación.
Respuesta1
Puedes rastrear elllamadas al sistemaque hace un programa. Este es el método habitual para saber a qué archivos accede. La herramienta para hacer esto se llamatruss
en muchos sistemas Unix,dtruss
en OSX,strace
en Linux. Describiré el uso de Linux aquí; Consulte el manual en otros sistemas.
La forma más simple es
strace myprogram arg1 arg2
Esto imprime un registro de todas las llamadas al sistema realizadas por myprogram
. (Ejemplo.) Para guardar el registro en un archivo, utilice la opción -o
. Para registrar también las llamadas realizadas por subprocesos, utilice la opción -f
. Para seleccionar qué llamadas al sistema se registran, use la opción -e
. Consulte el manual para obtener detalles sobre lo que puede utilizar como argumento -e
. Por ejemplo, la siguiente invocación registra llamadas al sistema relacionadas con archivos (apertura y cierre, listado de directorios, etc.) excepto read
y write
.
strace -e'file,!read,!write' -o /tmp/myprogram.log -f myprogram arg1 arg2
Respuesta2
De acuerdo aesta publicación, puedes hacerlo en Python usando elpsutilmódulo. Si no estás limitado a Python, entonceslsofyrastroson las dos utilidades de línea de comandos más utilizadas para este propósito.
Respuesta3
La única forma completamente confiable de hacerlo es rastrear las llamadas al sistema. El strace
programa (mencionado por @gowenfawr) hace esto correctamente y se implementa en términos de ptrace(2)
llamada al sistema. Tenga en cuenta, sin embargo, que la ptrace
llamada es difícil de utilizar correctamente; Si no puede usarlo strace -e open
directamente, considere la segunda forma:
Para la mayoría de los procesos, puede interceptar las llamadas a la open
función de la biblioteca C mediante LD_PRELOAD
. EstrivialSin embargo, es necesario que un programa C hostil evite esto; pero si confía en que un programa no realice llamadas al sistema por sí mismo, es más sencillo de implementar que programático ptrace
.
Para un proceso que usted sabe que está escrito en un lenguaje de nivel superior como Python, podría interceptar las open
llamadas de alto nivel, pero es probable que esto sea más difícil que interceptar las llamadas de nivel C a menos que el lenguaje esté diseñado para soportar tal interceptación (python no lo es).
Finalmente, todos los párrafos anteriores asumen que los archivos se abren con open
. Esto no siempre es cierto openat
, también hay datos open64
auxiliares recvmsg
y descriptores de archivos heredados del padre.