日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在 Shell 脚本中跟踪调试命令的执行

發布時間:2025/3/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在 Shell 脚本中跟踪调试命令的执行 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • shell 腳本調試系列
  • 概述
  • shell 跟蹤執行的重要性

shell 腳本調試系列

本系列的前面部分清晰地闡明了另外兩種 shell 腳本調試模式:詳細模式和語法檢查模式,并用易于理解的例子展示了如何在這些模式下啟用 shell 腳本調試。

Linux 中啟用 Shell 腳本的調試模式

在 Shell 腳本中執行語法檢查調試模式

在 Shell 腳本中跟蹤調試命令的執行


概述

shell 跟蹤簡單的來說就是跟蹤 shell 腳本中的命令的執行。要打開 shell 跟蹤,請使用 -x 調試選項。

這會讓 shell 在終端上顯示所有執行的命令及其參數。

終端版本

[xgj@entel2 ~]$ lsb_release -a LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch Distributor ID: CentOS Description: CentOS release 6.5 (Final) Release: 6.5 Codename: Final [xgj@entel2 ~]$

我們將使用下面的 sys_info.sh shell 腳本,它會簡要地打印出你的系統日期和時間、登錄的用戶數和系統的運行時間。不過,腳本中包含我們需要查找和更正的語法錯誤。

#!/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" ]; thenecho "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

注: 在Linux中可以通過 $UID獲取 當前用戶的id ,root用戶的uid 為0

保存文件并執行腳本。腳本只能用 root 用戶運行,因此如下使用 sudo 命令運行:

讓普通用戶xgj具有root的所有權限
執行vim /etc/sudoers之后,可以看見缺省只有一條配置:
root ALL=(ALL) ALL
那么你就在下邊再加一條配置:
xgj ALL=(ALL) ALL
這樣,普通用戶xgj 就能夠執行root權限的所有命令

[xgj@entel2 shells]$ chmod +x sys_info.sh [xgj@entel2 shells]$ sudo /bin/bash -x sys_info.sh

從上面的輸出我們可以觀察到,首先執行命令,然后其輸出做為一個變量的值。

例如,先執行 date,其輸出做為變量 DATE 的值。

我們可以執行語法檢查來只顯示其中的語法錯誤,如下所示:

$ sudo bash -n sys_info.sh

如果我們審視這個 shell 腳本,我們就會發現 if 語句缺少了封閉條件的 fi 關鍵字。因此,讓我們加上它,新的腳本應該看起來像這樣:

#!/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" ]; thenecho "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

再次保存文件并以 root 執行,同時做語法檢查:

$ sudo bash -n sys_info.sh

再一次檢查語法。

$ sudo bash -n sys_info.sh

上面的命令不會產生任何輸出,因為我們的腳本語法上正確。我們也可以再次跟蹤腳本執行,它應該工作得很好:

$ sudo /bin/bash -x sys_info.sh

現在運行腳本。

$ sudo ./sys_info.sh


shell 跟蹤執行的重要性

hell 腳本跟蹤可以幫助我們識別語法錯誤,更重要的是識別邏輯錯誤。例如,在 sys_info.sh shell 腳本中的 check_root 函數,它用于確定用戶是否為 root,因為腳本只允許由超級用戶執行。

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

這里的check_root由 if 語句表達式 ["$ UID" -ne "$ ROOT_ID"] 控制的,一旦我們不使用合適的數字運算符(示例中為 -ne,這意味著不相等),我們最終可能會出一個邏輯錯誤。

假設我們使用 -eq (意思是等于),這將允許任何系統用戶以及 root 用戶運行腳本,因此是一個邏輯錯誤。

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

注意:我們在本系列開頭介紹過,set 這個 shell 內置命令可以在 shell 腳本的特定部分激活調試。

因此,下面的行將幫助我們通過跟蹤腳本的執行在其中找到這個邏輯錯誤:

具有邏輯錯誤的腳本:

#!/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" ]; thenecho "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

保存文件并調用腳本,在輸出中,我們可以看到一個普通系統用戶可以在未 sudo 的情況下運行腳本。 這是因為 USER_ID 的值為 502,不等于為 0 的 root 的 ROOT_ID 。

$ ./sys_info.sh

總結

以上是生活随笔為你收集整理的在 Shell 脚本中跟踪调试命令的执行的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。