前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在 Shell 脚本中跟踪调试命令的执行

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

作者头像
小小工匠
发布2021-08-16 15:02:09
8890
发布2021-08-16 15:02:09
举报
文章被收录于专栏:小工匠聊架构

文章目录

shell 脚本调试系列

本系列的前面部分清晰地阐明了另外两种 shell 脚本调试模式:详细模式和语法检查模式,并用易于理解的例子展示了如何在这些模式下启用 shell 脚本调试。

Linux 中启用 Shell 脚本的调试模式

在 Shell 脚本中执行语法检查调试模式

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


概述

shell 跟踪简单的来说就是跟踪 shell 脚本中的命令的执行。要打开 shell 跟踪,请使用 -x 调试选项。

这会让 shell 在终端上显示所有执行的命令及其参数。

终端版本

代码语言:javascript
复制
[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 脚本,它会简要地打印出你的系统日期和时间、登录的用户数和系统的运行时间。不过,脚本中包含我们需要查找和更正的语法错误。

代码语言:javascript
复制
#!/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

注: 在Linux中可以通过 $UID获取 当前用户的id ,root用户的uid 为0

保存文件并执行脚本。脚本只能用 root 用户运行,因此如下使用 sudo 命令运行:

让普通用户xgj具有root的所有权限 执行vim /etc/sudoers之后,可以看见缺省只有一条配置: root ALL=(ALL) ALL 那么你就在下边再加一条配置: xgj ALL=(ALL) ALL 这样,普通用户xgj 就能够执行root权限的所有命令

代码语言:javascript
复制
[xgj@entel2 shells]$  chmod +x sys_info.sh
[xgj@entel2 shells]$ sudo /bin/bash -x sys_info.sh 
这里写图片描述
这里写图片描述

从上面的输出我们可以观察到,首先执行命令,然后其输出做为一个变量的值。

例如,先执行 date,其输出做为变量 DATE 的值。

我们可以执行语法检查来只显示其中的语法错误,如下所示:

代码语言:javascript
复制
$ sudo bash -n sys_info.sh 
这里写图片描述
这里写图片描述

如果我们审视这个 shell 脚本,我们就会发现 if 语句缺少了封闭条件的 fi 关键字。因此,让我们加上它,新的脚本应该看起来像这样:

代码语言:javascript
复制
#!/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

再次保存文件并以 root 执行,同时做语法检查:

代码语言:javascript
复制
$ sudo bash -n sys_info.sh
这里写图片描述
这里写图片描述

再一次检查语法。

代码语言:javascript
复制
$ sudo bash -n sys_info.sh

上面的命令不会产生任何输出,因为我们的脚本语法上正确。我们也可以再次跟踪脚本执行,它应该工作得很好:

代码语言:javascript
复制
$ sudo /bin/bash -x sys_info.sh
这里写图片描述
这里写图片描述

现在运行脚本。

代码语言:javascript
复制
$ sudo ./sys_info.sh
这里写图片描述
这里写图片描述

shell 跟踪执行的重要性

hell 脚本跟踪可以帮助我们识别语法错误,更重要的是识别逻辑错误。例如,在 sys_info.sh shell 脚本中的 check_root 函数,它用于确定用户是否为 root,因为脚本只允许由超级用户执行。

代码语言:javascript
复制
check_root(){
  if [ "$UID" -ne "$ROOT_ID" ]; then
    echo "You are not allowed to execute this program!"
    exit 1;
  fi
}

这里的check_root由 if 语句表达式 ["

假设我们使用 -eq (意思是等于),这将允许任何系统用户以及 root 用户运行脚本,因此是一个逻辑错误。

代码语言:javascript
复制
check_root(){
  if [ "$UID" -eq "$ROOT_ID" ]; then
    echo "You are not allowed to execute this program!"
    exit 1;
  fi
}

注意:我们在本系列开头介绍过,set 这个 shell 内置命令可以在 shell 脚本的特定部分激活调试。

因此,下面的行将帮助我们通过跟踪脚本的执行在其中找到这个逻辑错误:

具有逻辑错误的脚本:

代码语言:javascript
复制
#!/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

保存文件并调用脚本,在输出中,我们可以看到一个普通系统用户可以在未 sudo 的情况下运行脚本。 这是因为 USER_ID 的值为 502,不等于为 0 的 root 的 ROOT_ID 。

代码语言:javascript
复制
$ ./sys_info.sh
这里写图片描述
这里写图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/01/15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • shell 脚本调试系列
  • 概述
  • shell 跟踪执行的重要性
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档