Kuidas Shell Scriptis käskude täitmist jälgida Shelli jälitamisega


Shelliskripti silumissarja selles artiklis selgitame kolmandat shelliskripti silumisrežiimi, see tähendab kestade jälitamist, ja vaatame mõningaid näiteid selle toimimise ja kasutamise kohta.

Selle seeria eelmine osa heidab selgelt valgust kahele teisele shelliskripti silumisrežiimile: paljusõnaline režiim ja süntaksikontrolli režiim koos hõlpsasti mõistetavate näidetega selle kohta, kuidas lubada shelliskripti silumine nendes režiimides.

  1. Kuidas lubada Shelli skripti silumisrežiim Linuxis - 1. osa
  2. Kuidas süntaksikontrolli režiimi silumisrežiimi kontrollida kestakriptides - 2. osa

Shelli jälgimine tähendab lihtsalt käskude täitmise jälitamist shelliskriptis. Kesta jälgimise sisselülitamiseks kasutage silumisvalikut -x .

See suunab kest kuvama terminalis kõiki käske ja nende argumente nende täitmise ajal.

Kasutame allolevat shelliskripti sys_info.sh , mis prindib lühidalt teie süsteemi kuupäeva ja kellaaja, sisse loginud kasutajate arvu ja süsteemi tööaja. Kuid see sisaldab süntaksivigu, mille peame leidma ja parandama.

#!/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

Salvestage fail ja muutke skript käivitatavaks. Skripti saab käivitada ainult juur, seetõttu kasutage selle käivitamiseks järgmist käsku sudo:

$ chmod +x sys_info.sh
$ sudo bash -x sys_info.sh

Ülaltoodud väljundist võime täheldada, et käsk täidetakse kõigepealt, enne kui selle väljund asendatakse muutuja väärtusena.

Näiteks täideti kuupäev esmakordselt ja selle väljund asendati muutuja DATE väärtusena.

Süntaksikontrolli saame teostada ainult süntaksivigade kuvamiseks järgmiselt:

$ sudo bash -n sys_info.sh 

Kui vaatame shelliskripti kriitiliselt, mõistame, et if lause -st puudub lõppsõna fi . Seetõttu lisame selle ja uus skript peaks nüüd välja nägema allpool:

#!/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

Salvestage fail uuesti ja kutsuge see juurena ning kontrollige süntaksit:

$ sudo bash -n sys_info.sh

Meie ülaltoodud süntaksikontrolli tulemus näitab endiselt, et meie rea skriptil on veel üks viga 21. Seega on meil veel vaja süntaksi parandamist teha.

Kui vaatame skripti veel üks kord analüütiliselt läbi, on rida 21 tõrge tulenenud funktsiooni print_sys_info sees olevast viimasest kajakäsklusest puuduvast sulgemisest topeltsitaat (”) .

Lisame kaja käsku sulgeva topeltpakkumise ja salvestame faili. Muudetud skript on allpool:

#!/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

Nüüd kontrollige skripti veel üks kord süntaktiliselt.

$ sudo bash -n sys_info.sh

Ülaltoodud käsk ei tooda väljundit, kuna meie skript on nüüd süntaktiliselt õige. Samuti võime skripti täitmist jällegi teist korda jälgida ja see peaks hästi töötama:

$ sudo bash -x sys_info.sh

Nüüd käivitage skript.

$ sudo ./sys_info.sh

Shelli skripti täitmise jälgimise tähtsus

Shelli skripti jälgimine aitab meil tuvastada süntaksivead ja mis veelgi tähtsam - loogilised vead. Võtame näiteks shelliskriptis sys_info.sh funktsiooni check_root , mis on mõeldud selleks, et teha kindlaks, kas kasutaja on root või mitte, kuna skripti on lubatud ainult käivitada superkasutaja poolt.

check_root(){
    if [ "$UID" -ne "$ROOT_ID" ]; then
        echo "You are not allowed to execute this program!"
        exit 1;
    fi
}

Siinset maagiat juhib if lause avaldis [\ "$UID \" -ne\"$ROOT_ID \"] , kui me ei kasuta sobivat numbrilist operaatorit ( -ne antud juhul, mis tähendab, et see pole võrdne), jõuame lõpuks võimaliku loogilise veani.

Eeldades, et kasutasime -eq (tähendab võrdset), võimaldaks see skripti käivitada nii süsteemikasutajal kui ka juurkasutajal, seega loogiline viga.

check_root(){
    if [ "$UID" -eq "$ROOT_ID" ]; then
        echo "You are not allowed to execute this program!"
        exit 1;
    fi
}

Märkus. Nagu me selle seeria alguses varem vaatasime, saab sisseehitatud käsu shell sisse aktiveerida silumise shelliskripti konkreetses osas.

Seetõttu aitab järgmine rida meil funktsioonis selle loogilise vea leida, jälgides selle täitmist:

Skript loogilise veaga:

#!/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

Salvestage fail ja käivitage skript, näeme, et tavaline süsteemikasutaja saab skripti käivitada ilma sudo-ta, nagu allpool toodud väljundis. Selle põhjuseks on asjaolu, et USER_ID väärtus on 100, mis ei ole võrdne root ROOT_ID väärtusega 0.

$ ./sys_info.sh

Noh, see on praegu, oleme jõudnud shelliskripti silumisarja lõppu, allpool olevat vastusevormi saab kasutada selle juhendi või kogu 3-osalise seeriaga seotud küsimuste või tagasiside esitamiseks meile.