Kabuk İzleme ile Kabuk Komut Dosyasında Komutların Yürütülmesi Nasıl İzlenir


Kabuk komut dosyası hata ayıklama serisinin bu makalesinde, üçüncü kabuk komut dosyası hata ayıklama modunu, yani kabuk izlemeyi açıklayacağız ve nasıl çalıştığını ve nasıl kullanılabileceğini göstermek için bazı örneklere bakacağız.

Bu serinin önceki bölümü, diğer iki kabuk komut dosyası hata ayıklama moduna açıkça ışık tutuyor: ayrıntılı mod ve sözdizimi denetimi modu, kabuğun nasıl etkinleştirileceğine ilişkin anlaşılması kolay örneklerle Bu modlarda komut dosyasında hata ayıklama.

  1. Linux'ta Shell Komut Dosyası Hata Ayıklama Modu Nasıl Etkinleştirilir - Bölüm 1
  2. Kabuk Komut Dosyalarında Söz Dizimi Denetimi Hata Ayıklama Modu Nasıl Gerçekleştirilir - Bölüm 2

Kabuk izleme, basitçe komutların bir kabuk betiğinde yürütülmesini izlemek anlamına gelir. Kabuk izlemeyi açmak için -x hata ayıklama seçeneğini kullanın.

Bu, kabuğu tüm komutları ve bunların argümanlarını yürütülürken terminalde görüntülemeye yönlendirir.

Sisteminizin tarih ve saatini, oturum açan kullanıcı sayısını ve sistemin çalışma süresini kısaca yazdıran aşağıdaki sys_info.sh kabuk betiğini kullanacağız. Ancak bulmamız ve düzeltmemiz gereken sözdizimi hataları içeriyor.

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

Dosyayı kaydedin ve betiği çalıştırılabilir hale getirin. Komut dosyası yalnızca root tarafından çalıştırılabilir, bu nedenle onu çalıştırmak için sudo komutunu aşağıdaki gibi kullanın:

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

Yukarıdaki çıktıdan, bir komutun, çıktısı bir değişkenin değeri olarak değiştirilmeden önce ilk olarak çalıştırıldığını gözlemleyebiliriz.

Örneğin, ilk olarak tarih yürütüldü ve çıktısı, DATE değişkeninin değeri olarak değiştirildi.

Yalnızca sözdizimi hatalarını görüntülemek için sözdizimi kontrolünü aşağıdaki gibi yapabiliriz:

sudo bash -n sys_info.sh 

Kabuk betiğine eleştirel bir gözle bakarsak, if ifadesinde bir kapanış fi sözcüğünün eksik olduğunu fark edeceğiz. Bu nedenle onu ekleyelim ve yeni scriptimiz artık aşağıdaki gibi görünmelidir:

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

Dosyayı tekrar kaydedin ve root olarak çağırın ve bazı sözdizimi kontrolü yapın:

sudo bash -n sys_info.sh

Yukarıdaki sözdizimi kontrol işlemimizin sonucu, komut dosyamızda satır 21'de bir hatanın daha olduğunu gösteriyor. Yani hâlâ yapmamız gereken bazı sözdizimi düzeltmeleri var.

Betiği analitik olarak bir kez daha incelersek, satır 21'deki hatanın, ( ”)'nin eksik olmasından kaynaklandığını görürüz. >print_sys_info işlevi.

echo komutuna kapanış çift tırnakını ekleyeceğiz ve dosyayı kaydedeceğiz. Değiştirilen script aşağıdadır:

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

Şimdi betiği sözdizimsel olarak bir kez daha kontrol edin.

sudo bash -n sys_info.sh

Komut dosyamız artık sözdizimsel olarak doğru olduğundan yukarıdaki komut herhangi bir çıktı üretmeyecektir. Komut dosyasının yürütülmesini ikinci kez de takip edebiliriz ve iyi çalışması gerekir:

sudo bash -x sys_info.sh

Şimdi betiği çalıştırın.

sudo ./sys_info.sh

Shell Komut Dosyası Yürütme Takibinin Önemi

Kabuk komut dosyası izleme, sözdizimi hatalarını ve daha da önemlisi mantıksal hataları tanımlamamıza yardımcı olur. Örneğin, sys_info.sh kabuk betiğindeki check_root işlevini ele alalım; betiğin yalnızca çalıştırılmasına izin verildiğinden kullanıcının root olup olmadığını belirlemesi amaçlanır. süper kullanıcı tarafından.

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

Buradaki sihir, uygun sayısal operatörü () kullanmadığımızda if ifadesi ifadesi [ "$UID" -ne "$ROOT_ID" ] tarafından kontrol edilir. -ne bu durumda eşit değil anlamına gelir), olası bir mantıksal hatayla karşı karşıya kalırız.

-eq (eşit anlamına gelir) kullandığımızı varsayarsak, bu, kök kullanıcının yanı sıra herhangi bir sistem kullanıcısının da betiği çalıştırmasına izin verir, dolayısıyla mantıksal bir hata olur.

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

Not: Bu serinin başında daha önce incelediğimiz gibi, set Shell yerleşik komutu, bir kabuk betiğinin belirli bir bölümünde hata ayıklamayı etkinleştirebilir.

Bu nedenle, aşağıdaki satır, işlevin yürütülmesini izleyerek bu mantıksal hatayı bulmamıza yardımcı olacaktır:

Mantıksal hata içeren komut dosyası:

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

Dosyayı kaydedin ve scripti çağırın, aşağıdaki çıktıda olduğu gibi normal bir sistem kullanıcısının scripti sudo olmadan çalıştırabileceğini görebiliriz. Bunun nedeni, USER_ID değerinin 100 olması ve bunun, 0 olan kök ROOT_ID'ye eşit olmamasıdır.

./sys_info.sh

Şimdilik bu kadar, kabuk komut dosyası hata ayıklama serisinin sonuna geldik, bu kılavuzla veya 3 bölümlük serinin tamamıyla ilgili her türlü soru veya geri bildiriminizi bize iletmek için aşağıdaki yanıt formunu kullanabilirsiniz.