在 Shell 脚本中跟踪调试命令的执行
文章目录
- shell 脚本调试系列
- 概述
- shell 跟踪执行的重要性
shell 脚本调试系列
本系列的前面部分清晰地阐明了另外两种 shell 脚本调试模式:详细模式和语法检查模式,并用易于理解的例子展示了如何在这些模式下启用 shell 脚本调试。
Linux 中启用 Shell 脚本的调试模式
在 Shell 脚本中执行语法检查调试模式
在 Shell 脚本中跟踪调试命令的执行
概述
shell 跟踪简单的来说就是跟踪 shell 脚本中的命令的执行。要打开 shell 跟踪,请使用 -x 调试选项。
[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 脚本中跟踪调试命令的执行相关推荐
- Shell脚本中循环select命令用法笔记
在Shell脚本中,select命令是一种菜单扩展的循环方式. 语法结构如下: select Menu in (list) do command done 说明:当程序运行到select语句时,会自动 ...
- Linux系统Shell脚本中的echo命令
Linux系统Shell脚本中的echo命令 echo的作用 输出字符串 格式 echo "字符串内容" 一,显示转义字符 转义字符 ...
- Shell脚本中循环until命令用法笔记
在shell脚本中,可以使用until执行循环处理,如果使用until命令的话如果表达式的结果为false时才执行循环体,直到测试表达式的值为true的时候才会 停止循环. 语法结果如下: until ...
- shell脚本判断上一个命令是否执行成功
shell脚本中判断上一个命令是否执行成功 shell中使用符号"$?"来显示上一条命令执行的返回值,如果为0则代表执行成功,其他表示失败. 结合if-else语句实现判断上一个命 ...
- Shell 脚本中 set -ex 命令的作用
#!/bin/bash -ex shell 命令 set -ex,稍有常识的人都能看出,这是 set 命令加上了 -e 和 -x 两个参数 (废话么这不是).那么,我就把这两个参数拆开,分别说一下它在 ...
- shell脚本中如何获取命令的参数(2) ----处理命令参数
1 找出选项 1.1 处理简单选项 主要可以通过shfit工具对获取的到$1变量对比程序允许的变量值判断: 1.2 从参数中分离选项 一般参数可能在后面跟上适当的参数值,例如 sed -f ...
- shell脚本中使用top命令查看cpu或内存情况的技巧
在嵌入式系统在做高低温试验的过程中,需要实时记录多个信息,用于分析在故障时刻的数据,辅助判断故障可能产生的原因,如系统重新启动前内存.cpu的占用情况,温度的上升情况等等,今天仅分析cpu和内存的数据 ...
- Shell脚本中的交互式命令处理
先贴代码: DATE=`date -d -1hour +%T` fileName=erver_`date -d now +%Y-%m-%d-%H%M%S`.txt cp /home/BLload_ba ...
- 在shell脚本中使用sed命令更改文件中两个相似参数的其中一个
文件中含有两段数据,第一段是mysql1的配置,第二段是mysql2的配置. [root@ip-10-40-18-118 szh]# cat test.txt mysql1:host: 1.1.1.1 ...
最新文章
- 企业运维——机房建设的一些建议
- “躲避球”体育游戏《Sparc》登陆Rift和Vive,可以和PS用户一起玩了【附游戏视频】
- .Net 3.5新特性(1)Automatic Properties, Object Initializers, and Collection Initializers
- Python3 如何优雅地使用正则表达式(详解五)
- C#模板设计模式使用和学习心得
- Oracle学习:事务的基本概念
- 转发- css(display,float,position)
- 04:求整数的和与均值
- 预处理prepareStatement是怎么防止sql注入漏洞的?
- .NET简谈组件程序设计之(渗入序列化过程)
- 通过BeanPostProcessor理解Spring中Bean的生命周期及AOP原理 1
- 解决方法:Linux装完显卡驱动后分辨率显示不正常
- 智慧供应链的学习笔记(库存管理、配补货、仓间调拨、控制塔等)
- webrtc 的回声抵消算法
- CVPR2020目标检测方向论文
- 设计 | 分享5个好用的PPT模板网站
- adobe illustrator最新版,Illustrator 2022 mac(矢量图制作软件)26.3.1
- spring mvc校验部分属性,springmvc校验属性,java.lang.ClassNotFoundException: com.fasterxml.classmate.Filter
- 【书评】人月不必再相望,嫦娥已然在身旁——人月神话(40周年纪念版)
- 热敏电阻NTC、PTC
热门文章
- wide_and_deep 思维导图和代码
- 金融量化alpha和beta值的意义
- 重温强化学习之深度强化学习
- YOLO系列阅读(一) YOLOv1原文阅读:You Only Look Once: Unified, Real-Time Object Detection
- pytorch 笔记:gather 函数
- torch_geometric 笔记: 数据集Cora 简易 GNN
- pytorch笔记——简易回归问题
- SpringBoot 源码解析 —— SpringApplication 源码分析
- 多变量线性回归程序实现
- Hadoop自学笔记(七)Hadoop环境配置和优化