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
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.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.Antworten:
In Beitrag Nr. 16 des Threads https://www.unix.com/shell-programming-and-scripting/268856-how-pre-check-scrutinize-all-my-shell-scripts.html habe ich einen Perl mit 150 Zeilen gepostet Skript p1.txt , das ein nützlicher Ausgangspunkt sein kann. Ich habe auch einen Link zu einem weitaus vollständigeren, komplexeren Shell-Parser hinzugefügt
Es ist vielleicht am besten, den gesamten Thread zu betrachten - vielleicht sind auch einige andere Gesichtspunkte von Interesse.
Beste Grüße ... Prost, drl
quelle
Dies ist keine leichte Aufgabe. Sie haben bereits einige der Schwierigkeiten identifiziert. Textbasiertes Parsen ist sehr fehleranfällig, sehr einfach zu umgehen (wenn jemand möchte) und fast garantiert unvollständig.
Bash verfügt über eine integrierte 'Set'-Funktion, die das Skript analysiert, ohne es tatsächlich auszuführen. Dies könnte Ihnen helfen, aber auch das wird begrenzt sein.
Um es in einem Skript zu testen, fügen Sie es einfach
set -n
am Anfang des Skripts hinzu und führen Sie es dann aus.strace
Dies ist sehr nützlich, erfordert jedoch, dass das Skript tatsächlich ausgeführt wird. Dies ist etwas, das Sie tun möchten, nachdem Sie sicher sind, dass das Skript sicher ist.quelle