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

4

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

Não pretendo tentar acompanhar 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 para esse assunto)? Eu vou fazer algumas pesquisas por conta própria, eu apenas imaginei que eu perguntaria aqui caso haja usuários experientes por aí que saibam sobre esse tipo de coisa e possam fornecer mais explicações.

    
por RPi Awesomeness 12.10.2014 / 01:58

3 respostas

4

Você pode rastrear as chamadas de sistema feitas por um programa. Este é o método usual para descobrir quais arquivos ele acessa. A ferramenta para fazer isso é chamada de truss em muitos sistemas Unix, dtruss no OSX, strace no Linux. Vou descrever 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 . ( Example .) Para salvar o log em um arquivo, use a opção -o . Para também registrar chamadas feitas por subprocessos, use a opção -f . Para selecionar quais chamadas de sistema são registradas, use a opção -e . Veja o manual para detalhes sobre o que você pode usar como argumento para -e . Por exemplo, a chamada a seguir registra chamadas do 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
    
por 12.10.2014 / 02:37
1

De acordo com este post , você pode fazer isso em python usando o módulo psutil . Se você não está limitado a python, então lsof e strace são os dois utilitários de linha de comando mais comumente usados para essa finalidade.

    
por 12.10.2014 / 02:09
1

A única maneira completamente confiável de fazer isso é rastrear as chamadas do sistema. O programa strace (mencionado por @gowenfawr) faz isso corretamente e é implementado em termos da chamada do sistema ptrace(2) . Observe, no entanto, que a chamada ptrace é difícil de usar corretamente; Se você não pode usar strace -e open diretamente, considere a segunda maneira:

Na maioria dos processos, você pode interceptar as chamadas para a função open da biblioteca C via LD_PRELOAD . É trivial para um programa C hostil para evitar isso, no entanto; mas se você confia em um programa para não fazer o syscalls, é mais simples implementar do que programmatic ptrace .

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

Finalmente - todos os parágrafos acima assumem que os arquivos são abertos com open . Isso nem sempre é verdade, há também openat , open64 , recvmsg dados auxiliares e descritores de arquivos herdados do pai.

    
por 12.10.2014 / 02:18