Kuinka seurata komentojen suorittamista Shell-komentosarjassa Shell-jäljityksen avulla


Tässä shell-komentosarjojen virheenkorjaussarjan artikkelissa selitämme kolmannen komentosarjan komentosarjojen virheenkorjaustilan, ts. Kuoren jäljityksen, ja tarkastelemme joitain esimerkkejä osoittamaan, miten se toimii ja miten sitä voidaan käyttää.

Tämän sarjan edellinen osa valaisee selvästi kahta muuta komentosarjan komentosarjojen virheenkorjausmoodia: yksityiskohtainen tila ja syntaksitarkistustila, jossa on helposti ymmärrettäviä esimerkkejä siitä, miten komentosarjan komentosarjojen virheenkorjaus otetaan käyttöön näissä tiloissa.

  1. Kuinka Shell-komentosarjojen virheenkorjaustila otetaan käyttöön Linuxissa - osa 1
  2. Kuinka syntaksi tarkistaa virheenkorjaustila kuoriskripteissä - osa 2

Shell-jäljitys tarkoittaa yksinkertaisesti komentojen suorittamisen jäljittämistä shell-komentosarjassa. Ota kuoren jäljitys käyttöön käyttämällä -x -vianetsintävaihtoehtoa.

Tämä ohjaa kuoren näyttämään kaikki komennot ja niiden argumentit päätelaitteessa, kun ne suoritetaan.

Käytämme alla olevaa koodia sys_info.sh , joka tulostaa lyhyesti järjestelmän päivämäärän ja kellonajan, kirjautuneiden käyttäjien määrän ja järjestelmän käyttöajan. Se sisältää kuitenkin syntaksivirheitä, jotka meidän on löydettävä ja korjattava.

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

Tallenna tiedosto ja tee komentosarja suoritettavaksi. Komentosarjaa voi suorittaa vain pääkäyttäjä, joten käytä sudo-komentoa sen suorittamiseksi seuraavasti:

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

Yllä olevasta lähdöstä voidaan havaita, että komento suoritetaan ensin, ennen kuin sen lähtö korvataan muuttujan arvona.

Esimerkiksi päivämäärä suoritettiin ensin ja sen lähtö korvattiin muuttujan DATE arvona.

Voimme suorittaa syntaksitarkistuksen näyttääksesi syntaksivirheet seuraavasti:

$ sudo bash -n sys_info.sh 

Jos tarkastelemme komentosarjakomentosarjaa kriittisesti, ymmärrämme, että if lause -kohdasta puuttuu lopullinen fi -sana. Siksi lisätään se, ja uuden komentosarjan pitäisi nyt näyttää alla olevalta:

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

Tallenna tiedosto uudelleen ja kutsu se pääkäyttäjäksi ja tarkista syntaksi:

$ sudo bash -n sys_info.sh

Yllä oleva syntaksintarkastustoimintamme tulos osoittaa edelleen, että rivillä 21. komentosarjassa on vielä yksi virhe. Joten meillä on vielä joitain syntaksikorjauksia.

Jos katsomme komentosarjaa analyyttisesti vielä kerran, virhe rivillä 21 johtuu puuttuvasta sulkevasta kaksoislainauksesta (”) viimeisessä kaikukomennossa print_sys_info -toiminnon sisällä .

Lisätään lopullinen kaksoislainaus kaiku-komentoon ja tallennetaan tiedosto. Muutettu komentosarja on alla:

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

Tarkista komentosarja vielä kerran syntaktisesti.

$ sudo bash -n sys_info.sh

Yllä oleva komento ei tuota mitään tulosta, koska komentosarja on nyt syntaktisesti oikea. Voimme myös jäljittää komentosarjan suorituksen toisen kerran ja sen pitäisi toimia hyvin:

$ sudo bash -x sys_info.sh

Suorita nyt komentosarja.

$ sudo ./sys_info.sh

Shell-komentosarjojen suorituksen jäljityksen merkitys

Shell-komentosarjojen jäljitys auttaa meitä tunnistamaan syntaksivirheet ja mikä tärkeintä, loogiset virheet. Ota esimerkiksi komento sys_info.sh komentotulkkikomennossa check_root , joka on tarkoitettu määrittämään, onko käyttäjä pääkäyttäjä, koska komentosarja saa suorittaa vain pääkäyttäjä.

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

Taikuutta hallitsee if lause -lauseke ["$UID" -ne "$ROOT_ID"] , kun emme käytä sopivaa numeerista operaattoria ( -ne tässä tapauksessa, mikä tarkoittaa, ettei ole yhtä suuri), päädymme mahdolliseen loogiseen virheeseen.

Olettaen, että käytimme -eq (tarkoittaa yhtä kuin), tämä antaisi kaikille järjestelmän käyttäjille ja pääkäyttäjille mahdollisuuden suorittaa komentosarja, mikä on looginen virhe.

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

Huomaa: Kuten tarkastelimme aiemmin tämän sarjan alussa, sisäänrakennettu shell-komento voi aktivoida virheenkorjauksen tietyssä shell-komentosarjan osassa.

Siksi alla oleva rivi auttaa meitä löytämään tämän loogisen virheen funktiossa seuraamalla sen suoritusta:

Skripti, jossa on looginen virhe:

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

Tallenna tiedosto ja kutsu komentosarja, voimme nähdä, että tavallinen järjestelmän käyttäjä voi suorittaa komentosarjan ilman sudoa, kuten alla olevassa lähdössä. Tämä johtuu siitä, että käyttäjän USER_ID arvo on 100, joka ei ole sama kuin root ROOT_ID, joka on 0.

$ ./sys_info.sh

No, se on nyt, olemme päässeet komentosarjan komentosarjojen virheenkorjaussarjan loppuun, alla olevaa vastauslomaketta voidaan käyttää kysymyksiin tai palautteisiin, jotka koskevat tätä opasta tai koko 3-osaista sarjaa.