É possível escrever um comando que execute my.sh
eimprime todos os caminhos originados ou executados por este script recursivamente- Aquilo é,sem alterar o código originalde forma alguma? A ideia é verificar quais arquivos são realmente usados para um caminho de execução específico, sem rastreamento manual demorado e sujeito 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
Responder1
Isso parece funcionar:
$ 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 as open
chamadas de execução e impressão, troque stdout e stderr e formate o resultado para remover o texto irrelevante.
Ele também imprime alguns caminhos de biblioteca, o que não é 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 questões restantes:
- Existe alguma maneira de distinguir com segurança entre caminhos de shell e biblioteca? Este último parece ser possível, uma vez que todas as referências da biblioteca usam o
O_CLOEXEC
opção, enquanto nenhuma das referências do shell o faz. - É possível distinguir entre caminhos de origem e executados?
- Existem casos demonstráveis em que este comando falhará?