Weboldal keresés

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.

  1. A Shell Script hibakeresési mód engedélyezése Linuxban – 1. rész
  2. 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 print_sys_info függvényt.

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.