Existe alguma maneira de saber exatamente quais arquivos um comando está acessando?

Existe alguma maneira de saber exatamente quais arquivos um comando está acessando?

Estou trabalhando em um software que exige que eu saiba quais arquivos e recursos um determinado processo iniciado está acessando.

Não estou planejando tentar rastrear o que cada script, aplicativo e daemon está acessando, apenas um determinado processo fornecido pelo usuário.

Existe alguma maneira de fazer isso em Python (ou qualquer outra linguagem)? Vou fazer algumas pesquisas por conta própria, apenas decidi perguntar aqui caso haja usuários experientes por aí que saibam sobre esse tipo de coisa e possam fornecer um pouco mais de explicação.

Responder1

Você pode rastrear ochamadas do sistemaque um programa faz. Este é o método usual para descobrir quais arquivos ele acessa. A ferramenta para fazer isso é chamadatrussem muitos sistemas Unix,dtrussno OSX,straceno Linux. Descreverei o uso do Linux aqui; verifique o manual em outros sistemas.

A forma mais simples é

strace myprogram arg1 arg2

Isso imprime um log de todas as chamadas do sistema feitas por myprogram. (Exemplo.) Para salvar o log em um arquivo, utilize a opção -o. Para registrar também chamadas feitas por subprocessos, utilize a opção -f. Para selecionar quais chamadas do sistema serão registradas, use a opção -e. Consulte o manual para obter detalhes sobre o que você pode usar como argumento para -e. Por exemplo, a invocação a seguir registra chamadas de sistema relacionadas a arquivos (abertura e fechamento, listagem de diretórios, etc.), exceto reade write.

strace -e'file,!read,!write' -o /tmp/myprogram.log -f myprogram arg1 arg2

Responder2

De acordo comesta postagem, você pode fazer isso em python usando opsutilmódulo. Se você não está limitado ao python, entãolsofetraçosão os dois utilitários de linha de comando mais comumente usados ​​para essa finalidade.

Responder3

A única maneira totalmente confiável de fazer isso é rastrear chamadas do sistema. O straceprograma (mencionado por @gowenfawr) faz isso corretamente e é implementado em termos de ptrace(2)chamada de sistema. Observe, entretanto, que a ptracechamada é difícil de usar corretamente; se você não puder usar strace -e opendiretamente, considere a segunda maneira:

Para a maioria dos processos, você pode interceptar as chamadas para a openfunção da biblioteca C via LD_PRELOAD. Isso étrivialpara um programa C hostil evitar isso, entretanto; mas se você confia que um programa não fará syscalls, ele será mais simples de implementar do que programático ptrace.

Para um processo que você sabe que está escrito em uma linguagem de nível superior, como python, você poderia interceptar as openchamadas de alto nível, mas isso provavelmente será mais difícil do que interceptar as chamadas de nível C, a menos que a linguagem tenha sido projetada para suportar tal interceptação (python não é).

Finalmente - todos os parágrafos acima pressupõem que os arquivos sejam abertos com a extensão open. Isso nem sempre é verdade openat, também existem dados auxiliares open64e recvmsgdescritores de arquivo herdados do pai.

informação relacionada