Jak śledzić wykonywanie poleceń w skrypcie powłoki z śledzeniem powłoki
- 1458
- 110
- Juliusz Janicki
W tym artykule z serii debugowania skryptu Shell wyjaśnimy tryb debugowania skryptu trzeciego powłoki, czyli śledzenie powłoki i spojrzymy na niektóre przykłady, aby pokazać, jak to działa i jak można go użyć.
Poprzednia część tej serii wyraźnie rzuca światło na dwa pozostałe tryby debugowania skryptu Shell: Tryb wetbose I Sprawdzanie składni Tryb z łatwymi do zrozumienia przykładami sposobu włączenia debugowania skryptu Shell w tych trybach.
- Jak włączyć tryb debugowania skryptu Shell w Linux - część 1
- Jak wykonywać tryb debugowania składni w skontlerze
Śledzenie powłoki oznacza po prostu śledzenie wykonywania poleceń w skrypcie powłoki. Aby włączyć śledzenie powłoki, użyj -X
Opcja debugowania.
To kieruje powłożenie do wyświetlania wszystkich poleceń i ich argumentów na terminalu podczas ich wykonywania.
Użyjemy sys_info.cii
skrypt powłoki poniżej, który krótko drukuje datę i godzinę systemu, liczba użytkowników zalogowanych i czas pracy systemu. Zawiera jednak błędy składniowe, które musimy znaleźć i poprawić.
#!/bin/bash #script, aby wydrukować krótkie informacje o systemie root_id = "0" data = „data” no_users = "kto | Wc -L" uptime = "uptime" check_root () if ["$ uid" -Ne "$ root_id "]; Następnie echo „Nie możesz wykonać tego programu!„EXIT 1; print_sys_info () echo” System Time: $ data "Echo" Liczba użytkowników: $ no_users "echo" Uptime: $ uptime check_root print_sys_info exit 0
Zapisz plik i uczyń skrypt wykonywalny. Skrypt można uruchomić tylko przez root, a zatem zastosuj polecenie sudo, aby uruchomić go jak poniżej:
$ chmod +x sys_info.sh $ sudo bash -x sys_info.ciiŚledzenie powłoki - Pokaż błąd w skrypcie
Z powyższego wyjścia możemy zaobserwować, że polecenie jest wykonywane po raz pierwszy, zanim jego wyjście zostanie zastąpione jako wartość zmiennej.
Na przykład data został po raz pierwszy wykonany, a jego wyjście zastąpiono jako wartość zmiennej DATA.
Możemy wykonać sprawdzanie składni, aby wyświetlić błędy składniowe w następujący sposób:
$ sudo bash -n sys_info.ciiSprawdzanie składni w skrypcie
Jeśli spojrzymy na skrypt powłoki, zdamy sobie sprawę, że If oświadczenie
brakuje zamknięcia fi
słowo. Dlatego dodajmy to, a nowy skrypt powinien teraz wyglądać jak poniżej:
#!/bin/bash #script, aby wydrukować krótkie informacje o systemie root_id = "0" data = „data” no_users = "kto | Wc -L" uptime = "uptime" check_root () if ["$ uid" -Ne "$ root_id "]; Następnie echo „Nie możesz wykonać tego programu!„Exit 1; fi print_sys_info () echo„ czas systemowy: $ data ”liczba użytkowników: $ no_users„ echo ”Uptime: $ uptime check_root print_sys_info exit 0
Zapisz ponownie plik i wywołaj go jako root i wykonaj sprawdzanie składni:
$ sudo bash -n sys_info.ciiWykonaj sprawdzanie składni w skontlerze
Wynik naszej operacji sprawdzania składni powyżej wciąż pokazuje, że w naszym skrypcie jest jeszcze jeden błąd Linia 21. Więc nadal mamy do zrobienia pewną korektę składniową.
Jeśli przejrzymy skrypt analitycznie jeszcze raz, błąd Linia 21 jest spowodowane brakującym podwójnym cytatem zamykania (”)
w ostatnim poleceniu echo w środku print_sys_info
funkcjonować.
Dodamy podwójny cytat zamykający w Echo polecenie i zapisz plik. Zmieniony skrypt jest poniżej:
#!/bin/bash #script, aby wydrukować krótkie informacje o systemie root_id = "0" data = „data” no_users = "kto | Wc -L" uptime = "uptime" check_root () if ["$ uid" -Ne "$ root_id "]; Następnie echo „Nie możesz wykonać tego programu!„Exit 1; fi print_sys_info () echo„ czas systemowy: $ data ”liczba użytkowników: $ no_users„ echo ”Uptime: $ uptime” check_root print_sys_info exit 0
Teraz składnie sprawdź skrypt jeszcze raz.
$ sudo bash -n sys_info.cii
Powyższe polecenie nie wytworzy żadnego wyjścia, ponieważ nasz skrypt jest teraz poprawny składniowo. Również możemy prześledzić wykonanie skryptu po raz drugi i powinno działać dobrze:
$ sudo bash -x sys_info.ciiŚledź wykonanie skryptu powłoki
Teraz uruchom skrypt.
$ sudo ./sys_info.ciiSkrypt powłoki, aby pokazać datę, godzinę i czas aktualizacji
Znaczenie wykonywania skryptu powłoki
Śledzenie skryptów powłoki pomaga nam zidentyfikować błędy składniowe i, co ważniejsze, błędy logiczne. Weźmy na przykład Check_root
funkcja w sys_info.cii
skrypt powłoki, który ma na celu ustalenie, czy użytkownik jest root, czy nie, ponieważ skrypt może być wykonywany tylko przez superuser.
check_root () if ["$ uid" -Ne "$ root_id"]; Następnie echo „Nie możesz wykonać tego programu!„Wyjdź 1; fi
Magia tutaj jest kontrolowana przez If oświadczenie
wyrażenie [„$ Uid” -Ne „$ root_id”]
, Gdy nie używamy odpowiedniego operatora numerycznego (-ne
W takim przypadku, co oznacza nie równe), kończymy możliwym błędem logicznym.
Zakładając, że użyliśmy -Eq
(oznacza równe), pozwoliłoby to każdemu użytkownikowi systemu, a także użytkownik root uruchomienie skryptu, stąd błąd logiczny.
check_root () if ["$ uid" -eq "$ root_id"]; Następnie echo „Nie możesz wykonać tego programu!„Wyjdź 1; fi
Notatka: Jak spojrzeliśmy wcześniej na początku tej serii, wbudowane polecenie Set Shell może aktywować debugowanie w określonej części skryptu powłoki.
Dlatego poniższy wiersz pomoże nam znaleźć ten błąd logiczny w funkcji, śledząc jego wykonanie:
Skrypt z błędem logicznym:
#!/bin/bash #script, aby wydrukować krótkie informacje o systemie root_id = "0" data = „data” no_users = "kto | Wc -L" uptime = "uptime" check_root () if ["$ uid" -eq "$ root_id "]; Następnie echo „Nie możesz wykonać tego programu!„Exit 1; fi print_sys_info () echo” System Time: $ date "echo" Liczba użytkowników: $ no_users "echo" Uptime: $ uptime " #Turning On i wyłączanie debugowania funkcji check_root -x; check_root; ; set +x; print_sys_info exit 0
Zapisz plik i wywołać skrypt, widzimy, że zwykły użytkownik systemu może uruchomić skrypt bez sudo jak w poniższym wyjściu. Jest tak, ponieważ wartość IDENTYFIKATOR UŻYTKOWNIKA Jest 100 który nie jest równy korzeniowi Root_id który jest 0.
$ ./sys_info.ciiUruchom skrypt powłoki bez sudo
Cóż, na razie dotarliśmy do końca serii debugowania skryptów Shell, poniższy formularz odpowiedzi można użyć do odpowiedniego nam pytań lub informacji zwrotnych, dotyczące tego przewodnika lub całej serii 3-częściowej serii.
- « Poprawka błędu 2003 (HY000) nie może połączyć się z MySQL Server na '127.0.0.1 '(111)
- 3 Przydatne narzędzia do skanowania dysków Linux na podstawie GUI i »