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 é chamadatruss
em muitos sistemas Unix,dtruss
no OSX,strace
no 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 read
e 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 strace
programa (mencionado por @gowenfawr) faz isso corretamente e é implementado em termos de ptrace(2)
chamada de sistema. Observe, entretanto, que a ptrace
chamada é difícil de usar corretamente; se você não puder usar strace -e open
diretamente, considere a segunda maneira:
Para a maioria dos processos, você pode interceptar as chamadas para a open
funçã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 open
chamadas 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 open64
e recvmsg
descritores de arquivo herdados do pai.