Cara mengesan pelaksanaan arahan dalam skrip shell dengan pengesanan shell

Cara mengesan pelaksanaan arahan dalam skrip shell dengan pengesanan shell

Dalam artikel siri debugging skrip shell ini, kami akan menerangkan mod debugging skrip shell ketiga, iaitu pelacakan shell dan melihat beberapa contoh untuk menunjukkan bagaimana ia berfungsi, dan bagaimana ia boleh digunakan.

Bahagian sebelumnya siri ini jelas melemparkan cahaya ke atas dua mod debugging skrip shell lain: mod verbose dan Pemeriksaan sintaks mod dengan contoh yang mudah difahami bagaimana untuk membolehkan skrip shell debugging dalam mod ini.

  1. Cara Membolehkan Mod Debugging Skrip Shell Di Linux - Bahagian 1
  2. Cara Melakukan Sintaks Memeriksa Mod Debugging Dalam Skrip Shell - Bahagian 2

Pelacakan shell hanya bermaksud mengesan pelaksanaan perintah dalam skrip shell. Untuk menghidupkan pengesanan shell, gunakan -x Pilihan Debugging.

Ini mengarahkan shell untuk memaparkan semua arahan dan hujah mereka di terminal kerana mereka dilaksanakan.

Kami akan menggunakan sys_info.sh Skrip shell di bawah, yang secara ringkas mencetak tarikh dan masa sistem anda, bilangan pengguna yang log masuk dan uptime sistem. Walau bagaimanapun, ia mengandungi ralat sintaks yang perlu kita cari dan betul.

#!/bin/bash #script untuk mencetak maklumat sistem ringkas root_id = "0" date = "date" no_users = "who | wc -l" uptime = "uptime" check_root () if ["$ uid" -ne "root_id "]; Kemudian echo "Anda tidak dibenarkan melaksanakan program ini!"Keluar 1; print_sys_info () echo" masa sistem: $ date "echo" bilangan pengguna: $ no_users "echo" sistem uptime: $ uptime check_root print_sys_info exit 0 

Simpan fail dan buat skrip boleh dilaksanakan. Skrip hanya boleh dijalankan oleh Root, oleh itu menggunakan arahan sudo untuk menjalankannya seperti di bawah:

$ chmod +x sys_info.sh $ sudo bash -x sys_info.sh 
Shell Tracing - Tunjukkan ralat dalam skrip

Dari output di atas, kita dapat memerhatikan bahawa, perintah pertama kali dilaksanakan sebelum outputnya digantikan sebagai nilai pembolehubah.

Contohnya, Tarikh pertama kali dilaksanakan dan outputnya digantikan sebagai nilai pembolehubah TARIKH.

Kami boleh melakukan pemeriksaan sintaks untuk hanya memaparkan ralat sintaks seperti berikut:

$ sudo bash -n sys_info.sh 
Pemeriksaan sintaks dalam skrip

Sekiranya kita melihat skrip shell secara kritis, kita akan menyedari bahawa jika pernyataan kehilangan penutupan fi perkataan. Oleh itu, marilah kita menambahkannya dan skrip baru kini kelihatan seperti di bawah:

#!/bin/bash #script untuk mencetak maklumat sistem ringkas root_id = "0" date = "date" no_users = "who | wc -l" uptime = "uptime" check_root () if ["$ uid" -ne "root_id "]; Kemudian echo "Anda tidak dibenarkan melaksanakan program ini!"Keluar 1; fi print_sys_info () echo" masa sistem: $ date "echo" bilangan pengguna: $ no_users "echo" sistem uptime: $ uptime check_root print_sys_info exit 0 

Simpan fail sekali lagi dan serahkannya sebagai akar dan lakukan pemeriksaan sintaks:

$ sudo bash -n sys_info.sh 
Lakukan semak sintaks dalam skrip shell

Hasil operasi pemeriksaan sintaks kami di atas masih menunjukkan bahawa terdapat satu lagi bug dalam skrip kami Baris 21. Oleh itu, kami masih mempunyai pembetulan sintaks yang perlu dilakukan.

Sekiranya kita melihat skrip secara analitik sekali lagi, ralat pada Baris 21 disebabkan oleh petikan ganda penutupan yang hilang (") dalam perintah echo terakhir di dalam print_sys_info fungsi.

Kami akan menambah petikan ganda penutupan di echo Perintah dan simpan fail. Skrip yang diubah di bawah:

#!/bin/bash #script untuk mencetak maklumat sistem ringkas root_id = "0" date = "date" no_users = "who | wc -l" uptime = "uptime" check_root () if ["$ uid" -ne "root_id "]; Kemudian echo "Anda tidak dibenarkan melaksanakan program ini!"Keluar 1; fi print_sys_info () echo" masa sistem: $ date "echo" bilangan pengguna: $ no_users "echo" sistem uptime: $ uptime " check_root print_sys_info exit 0 

Sekarang sintaktik periksa skrip sekali lagi.

$ sudo bash -n sys_info.sh 

Perintah di atas tidak akan menghasilkan apa -apa output kerana skrip kami sekarang betul sintaksis. Kita juga dapat mengesan pelaksanaan skrip untuk kali kedua dan ia harus berfungsi dengan baik:

$ sudo bash -x sys_info.sh 
Pelaksanaan skrip shell jejak

Sekarang jalankan skrip.

$ sudo ./sys_info.sh 
Skrip shell untuk menunjukkan tarikh, masa dan masa uptime

Kepentingan pelaksanaan pelaksanaan skrip shell

Penjejakan skrip shell membantu kami mengenal pasti kesilapan sintaks dan lebih penting lagi, kesilapan logik. Ambil contohnya check_root berfungsi dalam sys_info.sh skrip shell, yang bertujuan untuk menentukan sama ada pengguna adalah akar atau tidak, kerana skrip hanya dibenarkan untuk dilaksanakan oleh superuser.

check_root () if ["$ uid" -ne "$ root_id"]; Kemudian echo "Anda tidak dibenarkan melaksanakan program ini!"Keluar 1; fi 

Keajaiban di sini dikawal oleh jika pernyataan ungkapan ["$ Uid" -ne "$ root_id"], Sebaik sahaja kita tidak menggunakan pengendali berangka yang sesuai (-ne Dalam kes ini, yang bermaksud tidak sama), kita berakhir dengan kemungkinan ralat logik.

Dengan mengandaikan bahawa kami menggunakan -Pers (bermaksud sama dengan), ini akan membenarkan mana -mana pengguna sistem serta pengguna root untuk menjalankan skrip, oleh itu ralat logik.

check_root () if ["$ uid" -eq "$ root_id"]; Kemudian echo "Anda tidak dibenarkan melaksanakan program ini!"Keluar 1; fi 

Catatan: Seperti yang kita lihat sebelum ini pada permulaan siri ini, perintah terbina dalam set shell dapat mengaktifkan debugging di bahagian tertentu skrip shell.

Oleh itu, garis di bawah akan membantu kita mencari ralat logik ini dalam fungsi dengan mengesan pelaksanaannya:

Skrip dengan ralat logik:

#!/bin/bash #script untuk mencetak maklumat sistem ringkas root_id = "0" date = "date" no_users = "who | wc -l" uptime = "uptime" check_root () if ["$ uid" -eq "$ root_id "]; Kemudian echo "Anda tidak dibenarkan melaksanakan program ini!"Keluar 1; fi print_sys_info () echo" masa sistem: $ date "echo" bilangan pengguna: $ no_users "echo" sistem uptime: $ uptime " #turning on dan off debugging fungsi check_root set -x; check_root ; set +x; print_sys_info Exit 0 

Simpan fail dan memohon skrip, kita dapat melihat bahawa pengguna sistem biasa dapat menjalankan skrip tanpa sudo Seperti dalam output di bawah. Ini kerana nilai ID PENGGUNA adalah 100 yang tidak sama dengan akar Root_id iaitu 0.

$ ./sys_info.sh 
Jalankan skrip shell tanpa sudo

Nah, itu buat masa ini, kami telah sampai ke akhir siri debugging skrip shell, borang tindak balas di bawah boleh digunakan untuk menangani sebarang pertanyaan atau maklum balas kepada kami, mengenai panduan ini atau keseluruhan siri 3 bahagian.