Ich versuche eine Methode zu finden, um alle Programme aufzulisten, die ein Skript verwendet, wenn es ausgeführt wird, ohne es tatsächlich auszuführen.
Ich habe diese schnellen und schmutzigen Oneliner geschrieben:
# fill an array with all the useful words except variables, options, brackets, quotes
readarray -t list <<<$( grep -v '^#' script.sh | sed 's/[0-9a-zA-Z_\-]*=//g ; s/\${.*}//g ; s/\$(//g ; s/[)'\"\'\`']//g ; s/ --*.//g ' )
# for every word in array show info with `type' and clean the output again
for p in "${list[@]}" ; do type "${p}" ; done 2>&1 | grep -v -e '^bash:' -e 'shell keyword' -e 'shell builtin' | sort | uniq | sed 's/^.* //g ; s/[\(\)]//g'
Ich denke die Probleme sind:
- Wenn das Programm nicht installiert ist, schlägt "type" fehl
- Hier können Dokumente Schlüsselwörter enthalten, die Programme sein können ...
- Wenn das Skript nicht gut geschrieben ist, kann sich die Schwierigkeit erhöhen ("Shellcheck" kann nützlich sein).
- Externe Konfigurationsdateien und Funktionsbibliotheken werden nicht nachverfolgt (siehe ilkkachu-Kommentar).
Eine bessere Lösung?
strace -fe execve
strace
wie vorgeschlagen verwenden), wird nur angezeigt, was in diesem bestimmten Lauf verwendet wurde. Andere Eingabedaten können dazu führen, dass andere Programme aufgerufen werden.
strace
und nehmen Sie alleexec()
Anrufe zur Kenntnis ? Und dann versuchen Sie sicherzustellen, dass Sie alle möglichen Codepfade und alle möglichen Eingaben verarbeiten ... Ich glaube nicht, dass dies im Allgemeinen möglich ist, da alles, was das Skript tut, von externen Konfigurationsdateien und Funktionsbibliotheken usw.