¿Hay alguna forma de saber exactamente a qué archivos accede un comando?

¿Hay alguna forma de saber exactamente a qué archivos accede un comando?

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 llamatrussen muchos sistemas Unix,dtrussen OSX,straceen 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 ready 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 straceprograma (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 ptracellamada es difícil de utilizar correctamente; Si no puede usarlo strace -e opendirectamente, considere la segunda forma:

Para la mayoría de los procesos, puede interceptar las llamadas a la openfunció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 openllamadas 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 open64auxiliares recvmsgy descriptores de archivos heredados del padre.

información relacionada