Mam dużą liczbę skryptów, które muszę zmodyfikować. Każdy skrypt prawdopodobnie wywołuje od 5 do 10 innych skryptów, które z kolei mogą wywoływać kilka innych skryptów i kto wie, jak głęboko biegnie ta królicza nora.
Czy jest jakiś sposób na uzyskanie listy skryptów wywoływanych przez określony skrypt?
Myślę o czymś takim:
/home/root/ $ showscripts mytargetscript
wynik byłby mniej więcej taki:
/home/root/mytargetscript
/home/root/asubscript
/home/root/bsubscript
...
Jeśli obraziłem bogów uniksowych, z góry oferuję swoją pokutę. Odpowiadam na wiele pytań na dba.se.
truss
Wywołańexec
systemowych?Odpowiedzi:
Nie ma ogólnego rozwiązania, ponieważ istnieje niezliczona ilość sposobów, za pomocą których skrypt może wywoływać inne skrypty. Możesz zrobić coś,
grep
co może działać dla twoich skryptów, ale ogólnie nie.Jakie skrypty to wywołuje?
Jeśli jesteś w stanie uruchomić te skrypty, możesz je prześledzić na dwa sposoby.
sprawi, że skrypt wydrukuje każde wykonane polecenie w rozszerzonej formie. Następnie możesz sprawdzić te polecenia pod kątem tych, które uruchamiają skrypty.
Przesada, ale
strace
daje ci wszystko, co robi proces, a dzięki-ff
opcji podąża za króliczą dziurą prawie do końca. Mówię prawie dlatego, że istnieją sposoby na obejście tego. Czy podąża za demonami?Grep
strace
dla wywołańopen()
lubexec*()
filtruj je w poszukiwaniu plików, które są skryptami, a możesz być gdzieś w pobliżu pełnego obrazu [dla tego jednego uruchomienia skryptu, który wykonałeś - nie licząc skryptów, które są wywoływane tylko w innych warunkach].Możesz więc być kreatywny ze swoimi rozwiązaniami, po prostu nie oczekuj takiego, który pasuje do każdej sytuacji.
źródło
grep
przykładu. Alegrep
nie znajduje żadnych prócz najbardziej prymitywnych wywołań (które mogą być wszystkim, co jest tu potrzebne, ale kto wie) i istnieje możliwość fałszywych dopasowań.# this script is commented out
iecho "havea nice script"
.Asusming wszystkie skrypty żyją w tym samym katalogu, nie mają w nazwach tabulatorów ani znaków nowej linii, a lista „interesujących” skryptów znajduje się w pliku
scripts.txt
, po jednym w wierszu, a także przy założeniu, że powłoka może dokonywać<(...)
podstawień procesów:To buduje plik
calls.txt
. Plik składa się z par oddzielonych tabulatoramiscript1 script2
, które opisują relacje „script1
wywołaniascript2
”.Musisz nakarmić
calls.txt
następujący skrypt Perla:Skrypt buduje ukierunkowany wykres na podstawie relacji wywołania, a następnie drukuje następców dla wszystkich wierzchołków (tj. Skryptów).
Oczywiście skrypt wymaga modułu Perl
Graph
. Zakładając, że maszcpanm
skrypt, możesz zainstalować wymagany moduł, uruchamiając gocpanm Graph
.źródło
.sh
. w ogóle nie mają rozszerzenia. :-(scripts.txt
jednym w wierszu, prawda?Biorąc pod uwagę scenariusz
Następnie
produkuje
i dlatego pokażą te połączenia, jeśli zaczynają się na początku linii (dopuszcza spacje lub tabulatory)
Można również zidentyfikować pliki wykonywalne dla „listy plików, dla których można to zrobić” zamiast utrzymywać listę zakodowaną przy pomocy np.
i możesz fajkować
źródło
Jeden z możliwych sposobów (niesprawdzony) jest następujący.
Podsumowanie: masz wiele skryptów powłoki, wszystkie wywołują się nawzajem. Chcesz wiedzieć, jaka jest relacja wywołująca między tymi skryptami.
Załóżmy, że wszystkie skrypty są wywoływane jako osobne programy, ponieważ Gilles mówi mi, że w takim przypadku wywoływany skrypt jest procesem potomnym wywołującego skryptu.
Następnie umieść kod w każdym skrypcie, który zapisuje takie informacje, jak identyfikator procesu, identyfikator procesu nadrzędnego i nazwa skryptu do bazy danych. Ten kod może być wspólny dla wszystkich skryptów. Następnie przetwarzaj informacje bazy danych po uruchomieniu skryptu (ów), aby ustalić relację wywoływania między skryptami.
źródło