Script contenedor para enumerar archivos de origen/ejecutados

Script contenedor para enumerar archivos de origen/ejecutados

¿Es posible escribir un comando que se ejecute my.shyimprime cada ruta obtenida o ejecutada por este script de forma recursiva- Eso es,sin alterar el código original¿en absoluto? La idea es verificar qué archivos se utilizan realmente para una ruta de ejecución específica, sin un seguimiento manual que requiere mucho tiempo y es propenso a errores.

Por ejemplo:

$ > 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

Respuesta1

Esto 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-

En otras palabras, rastree las openllamadas de ejecución e impresión, intercambie stdout y stderr, luego formatee el resultado para eliminar el texto irrelevante.

También imprime algunas rutas de biblioteca, lo que en realidad no es un gran 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

Algunas preguntas restantes:

  • ¿Existe alguna forma de distinguir de manera confiable entre las rutas del shell y de la biblioteca? Esto último parece ser posible ya que todas las referencias de la biblioteca utilizan elO_CLOEXECopción, mientras que ninguna de las referencias de shell lo hace.
  • ¿Es posible distinguir entre rutas de origen y ejecutadas?
  • ¿Existen casos extremos demostrables en los que este comando fallará?

información relacionada