Hogyan lehet nyomon követni a parancsok végrehajtását a Shell Scriptben a Shell Tracing segítségével
A shell szkriptek hibakeresési sorozatának ebben a cikkében elmagyarázzuk a harmadik shell script hibakeresési módot, vagyis a shell nyomkövetést, és néhány példával bemutatjuk, hogyan működik és hogyan használható.
A sorozat előző része világosan rávilágít a két másik shell script hibakeresési módra: a bőbeszédű módra és a szintaktikaellenőrző módra, könnyen érthető példákkal a shell engedélyezésére. script hibakeresés ezekben a módokban.
- A Shell Script hibakeresési mód engedélyezése Linuxban – 1. rész
- A szintaktikai ellenőrzés végrehajtása a hibakeresési módban Shell Scriptsben – 2. rész
A shell tracing egyszerűen azt jelenti, hogy nyomon követjük a parancsok végrehajtását egy shell szkriptben. A shell nyomkövetés bekapcsolásához használja a -x
hibakeresési opciót.
Ez arra utasítja a shellt, hogy az összes parancsot és argumentumait megjelenítse a terminálon végrehajtásuk közben.
Az alábbi sys_info.sh
shell szkriptet fogjuk használni, amely röviden kiírja a rendszer dátumát és idejét, a bejelentkezett felhasználók számát és a rendszer üzemidejét. Ugyanakkor szintaktikai hibákat tartalmaz, amelyeket meg kell találnunk és javítanunk kell.
#!/bin/bash
#script to print brief system info
ROOT_ID="0"
DATE=`date`
NO_USERS=`who | wc -l`
UPTIME=`uptime`
check_root(){
if [ "$UID" -ne "$ROOT_ID" ]; then
echo "You are not allowed to execute this program!"
exit 1;
}
print_sys_info(){
echo "System Time : $DATE"
echo "Number of users: $NO_USERS"
echo "System Uptime : $UPTIME
}
check_root
print_sys_info
exit 0
Mentse el a fájlt, és tegye futtathatóvá a szkriptet. A szkriptet csak a root futtathatja, ezért használja a sudo parancsot a futtatásához az alábbiak szerint:
chmod +x sys_info.sh
sudo bash -x sys_info.sh
A fenti kimenetből megfigyelhetjük, hogy egy parancs először végrehajtásra kerül, mielőtt a kimenetét egy változó értékével helyettesítené.
Például a dátum először végrehajtásra került, és a kimenete a DATE változó értéke lett.
Elvégezhetjük a szintaktikai ellenőrzést, hogy csak a szintaktikai hibákat jelenítsük meg az alábbiak szerint:
sudo bash -n sys_info.sh
Ha kritikusan nézzük a shell szkriptet, rájövünk, hogy az if utasításból
hiányzik egy záró fi
szó. Ezért adjuk hozzá, és az új szkriptnek most így kell kinéznie:
#!/bin/bash
#script to print brief system info
ROOT_ID="0"
DATE=`date`
NO_USERS=`who | wc -l`
UPTIME=`uptime`
check_root(){
if [ "$UID" -ne "$ROOT_ID" ]; then
echo "You are not allowed to execute this program!"
exit 1;
fi
}
print_sys_info(){
echo "System Time : $DATE"
echo "Number of users: $NO_USERS"
echo "System Uptime : $UPTIME
}
check_root
print_sys_info
exit 0
Mentse újra a fájlt, és hívja meg rootként, és végezzen szintaktikai ellenőrzést:
sudo bash -n sys_info.sh
A fenti szintaktikai ellenőrzésünk eredménye továbbra is azt mutatja, hogy a szkriptünkben van még egy hiba a 21. sorban. Tehát még van némi szintaktikai korrekciónk.
Ha még egyszer analitikusan átnézzük a szkriptet, akkor a 21. sorban a hiba a ( )
záró kettős idézőjeléből adódik a
Hozzáadjuk a záró dupla idézőjelet az echo parancshoz, és mentjük a fájlt. A megváltozott szkript alább található:
#!/bin/bash
#script to print brief system info
ROOT_ID="0"
DATE=`date`
NO_USERS=`who | wc -l`
UPTIME=`uptime`
check_root(){
if [ "$UID" -ne "$ROOT_ID" ]; then
echo "You are not allowed to execute this program!"
exit 1;
fi
}
print_sys_info(){
echo "System Time : $DATE"
echo "Number of users: $NO_USERS"
echo "System Uptime : $UPTIME"
}
check_root
print_sys_info
exit 0
Most szintaktikailag ellenőrizze még egyszer a szkriptet.
sudo bash -n sys_info.sh
A fenti parancs nem ad semmilyen kimenetet, mert a szkriptünk szintaktikailag helyes. Másodszor is nyomon követhetjük a szkript végrehajtását, és jól kell működnie:
sudo bash -x sys_info.sh
Most futtassa a szkriptet.
sudo ./sys_info.sh
A Shell Script végrehajtásának nyomon követésének jelentősége
A shell script nyomkövetés segít a szintaktikai hibák és ami még fontosabb, a logikai hibák azonosításában. Vegyük például a sys_info.sh
shell szkriptben található check_root
függvényt, amely annak meghatározására szolgál, hogy egy felhasználó root-e vagy sem, mivel a szkript csak végrehajtható. a szuperfelhasználó által.
check_root(){
if [ "$UID" -ne "$ROOT_ID" ]; then
echo "You are not allowed to execute this program!"
exit 1;
fi
}
A varázslatot itt az if utasítás
[ "$UID" -ne "$ROOT_ID" ]
kifejezés vezérli, ha nem használjuk a megfelelő numerikus operátort ( -ne
ebben az esetben, ami nem egyenlő ), egy esetleges logikai hibához jutunk.
Feltételezve, hogy a -eq
-t ( jelentése egyenlő:) használjuk, ez lehetővé tenné bármely rendszerfelhasználónak, valamint a root felhasználónak a szkript futtatását, tehát logikai hiba.
check_root(){
if [ "$UID" -eq "$ROOT_ID" ]; then
echo "You are not allowed to execute this program!"
exit 1;
fi
}
Megjegyzés: Amint azt a sorozat elején korábban láttuk, a set shell beépített parancs aktiválhatja a hibakeresést a shell-szkript egy adott szakaszában.
Ezért az alábbi sor segít megtalálni ezt a logikai hibát a függvényben a végrehajtásának nyomon követésével:
A szkript logikai hibával:
#!/bin/bash
#script to print brief system info
ROOT_ID="0"
DATE=`date`
NO_USERS=`who | wc -l`
UPTIME=`uptime`
check_root(){
if [ "$UID" -eq "$ROOT_ID" ]; then
echo "You are not allowed to execute this program!"
exit 1;
fi
}
print_sys_info(){
echo "System Time : $DATE"
echo "Number of users: $NO_USERS"
echo "System Uptime : $UPTIME"
}
#turning on and off debugging of check_root function
set -x ; check_root; set +x ;
print_sys_info
exit 0
Mentse el a fájlt és hívja meg a szkriptet, láthatjuk, hogy egy rendszeres rendszerfelhasználó futtathatja a szkriptet sudo nélkül, ahogy az alábbi kimenetben látható. Ennek az az oka, hogy a USER_ID értéke 100, ami nem egyenlő a gyökér ROOT_ID értékével, amely 0.
./sys_info.sh
Nos, egyelőre ennyi, a shell script hibakereső sorozatának a végéhez érkeztünk, az alábbi válaszlapon bármilyen kérdéssel vagy visszajelzéssel fordulhatsz hozzánk, ezzel az útmutatóval vagy a teljes 3 részes sorozattal kapcsolatban.