Script Wrapper para listar arquivos originados / executados

1

É possível escrever um comando que execute my.sh e imprime cada caminho originado ou executado por este script recursivamente - Ou seja, sem alterar o código original em todos? A ideia é verificar quais arquivos são realmente usados para um caminho de execução específico, sem rastreamento manual demorado e propenso a erros.

Por exemplo:

$ > my.sh cat <<'EOF'
#!/bin/sh
. ./foo.sh
EOF
$ > foo.sh cat <<'EOF'
#!/bin/sh
./bar.sh
EOF
$ > bar.sh cat <<'EOF'
#!/bin/sh
echo bar
EOF
$ chmod u+x my.sh bar.sh
$ magic command
[...]
./my.sh
./foo.sh
./bar.sh
    
por l0b0 24.04.2013 / 16:24

1 resposta

1

Isso parece fazer o truque:

$ strace -fe open ./my.sh 2>&1 >/dev/null | \
grep --only-matching '^\(\[pid\s\+[0-9]*\] \)\?open("[^"]\+' | \
grep --only-matching '".*' | \
cut --characters 2-

Em outras palavras, rastreie a execução e imprima open chamadas, troque stdout e stderr, depois formate o resultado para remover texto irrelevante.

Ele também imprime alguns caminhos de biblioteca, o que não é realmente um grande problema:

/etc/ld.so.cache
/lib/x86_64-linux-gnu/libc.so.6
./my.sh
./foo.sh
/etc/ld.so.cache
/lib/x86_64-linux-gnu/libc.so.6
./bar.sh

Algumas perguntas restantes:

  • Existe alguma maneira de diferenciar de maneira confiável os caminhos do shell e da biblioteca? O último parece ser possível, pois todas as referências da biblioteca usam a opção O_CLOEXEC , enquanto nenhuma das referências de shell faz.
  • É possível distinguir entre caminhos originados e executados?
  • Existem exemplos de casos demonstráveis em que esse comando falhará?
por 24.04.2013 / 16:48

Tags