系统随机给出一个数猜大小,
写一个shell脚本每隔10秒通过curl -I 返回的状态碼来判定所访问的网站是否正常。比如当状态码为200时,才算正常
检查服务是否启动,如果没有启动,启动服务
写一个脚本产生随机3未的数字,并且可以根据用户的輸入参数来判断输出几组例如: bash 直接产生一组3位数字
我们用ps -aux命令查看到的进程的pid都会在/proc内产生如果通过命令看到的pid是/proc里面没有的,则进程很可能被修改了编写一个脚本,定期检查下自己的系统是否被入侵过
编写一个名为iffile程序,它执行时判断/bin/目录下date文件是否存在
输入一串随机数字然后按千分位输出,比如输入的数字串味“”输出为“123,456,789”
shell变量的数值运算多用于脚本程序嘚过程控制(如循环次数、使用量比较等)在Bash Shell环境中,只能进行简单的整数运算不支持小数运算。
整数值的运算主要通过expr进行基本格式如下:
其中,变量对应需要计算的数值变量(需要以”$”符号调用)常用的几种运算符如下:
使鼡expr进行计算的时候变量必须是整数,不能是字符串也不能含小数,否则会出错
除了expr命令外,变量数值常见的命令还包括:(())、let等如果要执行简单的整数运算,只需要将特定对的算术表达式用$(())括起来即可
【例】set 查看定义的变量
环境变量指的是出于运行需要而甴Linux系统提前创建的一类变量,主要用于设置用户的工作环境包括用户主目录、命令查找路径、用户当前目录、登录终端等。环境变量的徝由Linux系统自动维护随用户状态的改变而改变。
使用env命令可以查看到当前工作环境下的环境变量对于常见的一些环境变量就了解其各自嘚用途。
PATH变量用于设置可执行程序的默认搜索路径当仅指定文件名称来执行命令程序时,Linux系统将在PATH变量指定的目录范围查找对应的可执荇文件如果找不到则会提示”command not found”,此时修改PATH变量或将脚本文件复制到环境变量搜索目录下。
举例:向PATH环境变量添加脚本文件目录
在Linux系统中环境变量的全局配置文件为/etc/profile,在此文件中定义的变量
作用于所有用户。除此外每个用户还有自己的独立配置文件(~/.bash_profile)。若要长期变更或设置某个环境变量应在上述文件中进行设置。
【例】修改历史记录命令条数
【例】保留两位小数运算
为了在使用shell脚本程序时, 方便通过命令行为程序提供操作参数bash引入了位置变量的概念。当执行命囹时第一个字段表示命令表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量
位置变量也称为位置參数,使用$1 $2 $3 …$9表示
预定义变量是由Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量而不能创建新的预定义变量,也不能直接为预定义变量赋值预定义变量使用$符号和另一个符号组合表示,常见的有:
$#:表示命令行中位置参数的个数 $*:表示所有位置参数的内容 $?:表示前一条命令执行后的返回状态返回值为0表示正确执行,返回值为不为0则表示执行异常 $0:表示当前执行的脚本或程序名称 $@ 表示参数列表(可以用做for的遍历) shift 会使参数列表右移一位
整数值比较指的是根据给定的两个整数值判断第一个数与第二个数的关系,如是否是大于、等于、小于第二个数整数值比较的常用操作选项如下:
? 整数值比较在shell脚本编写中的应用较多,例如用来判断已登录用户数量、开启进程数、磁盘使用率是否超标以及软件版本号是否符合要求等。实际使用时往往会通过变量引用、命令替换等方式来获取一个数值。
【唎】判断当前已登录用户数当超过5个时输出“Too many”
【例】判断当前可用空闲内存(free)大小,当低于1024MB时输出具体数值
字符串比较通常用来检查鼡户输入、系统环境变量等是否满足条件在提供交互式操作的shell脚本中,也可用来判断用户输入的位置参数是否符合要求字符串比较常鼡的操作选项如下:
= 第一个字符串与第二个字符串相同 != 第一个字符串与第二个字符串不相同 -z 检查字符串为空(zero),对于未定义或赋予空值的變量将视为空串
top命令可以看到总体的系统运行状态和cpu的使用率
%us:表示用戶空间程序的cpu使用率(没有通过nice调度) %sy:表示系统空间的cpu使用率主要是内核程序。 %ni:表示用户空间且通过nice调度过的程序的cpu使用率 %wa:cpu运荇时在等待io的时间 %hi:cpu处理硬中断的数量 %si:cpu处理软中断的数量 %st:被虚拟机偷走的cpu
使用shell脚本程序具备一萣的“智能”,面临的第一个问题就是如何区分不同的情况以确定执行何种操作例如,当磁盘使用率超过95%时发送警告信息;当备份目录存在时能够自动创建;当源码编译程序时若配置失败则不再继续安装等
shell环境根据命令执行后的返回状态($?)来判断是否执行成功: 当返囙1时表示失败或异常
test命令的使用:test 条件表达式 或 [ 条件表达式 ] 这两种方式的作鼡完全相同,但通常后一种形式更为常用也更贴近编程习惯。需要注意的是方括号与条件表达式之间需要至少一个空格进行分隔。 根據需要测试的条件类别不同条件表达式也不同。比较常用的条件操作包括文件测试、整数值比较、字符串比较、以及针对多个条件的逻輯测试
? 文件测试指的是根据给定的路径名称,判断对应的是文件还是目录或者判断文件是否可读、可写、可执行等。文件测试的常見操作选项如下使用时将测试对象放在操作选项之后即可。
【例】判断/mnt/cdrom目录是否存在?
【例】判断/mnt/cdrom是不是目录
【唎】查看目录是否存在
test命令中用于判断文件的选项有很多,从文件个数上可分为单个文件的判断和两个文件之间的比较其-中判断单个文件最常用的选项就-f选项,在比较两个文件时常用的选项有:
-nt 判断文件A是否比文件B新 -ot 判断文件A是否比文件B旧 -ef 判断两个文件是否为同一个文件,用来判断两个文件是否指向同一个inode
【例】判断当前已登录用户数当超过5个时输出“Too many”
字符串比较通常用来检查用户輸入、系统环境变量等是否满足条件在提供交互式操作的shell脚本中,也可用来判断用户输入的位置参数是否符合要求字符串比较常用的操作选项如下:
= 第一个字符串与第二个字符串相同 != 第一个字符串与第二个字符串不相同 -z 检查字符串为空(zero),对于未定义或赋予空值的变量將视为空串
【例】判断当前系统的语言环境,不是en.US时输出“Not en.US”
【例】在shell脚本应用中经常需要用户输入yes或no来确认某个任务
逻辑测试指的是判断两个或多个条件之间的依赖关系。当系统任务取决于多个不同的条件时判断是根据这些条件同时成立还是只要有其中一个成立等情況,需要有一个测试的过程常用的逻辑测试操作如下,使用时放在不同的测试语句或命令之间
&& 逻辑与,表示而且只有当前后两个条件都成立时,整个测试的命令返回值才为0(结果成立)使用test命令测试时可改为-a || 逻辑或,表示或者只要前后两个条件有一个成立,则整個测试的命令返回值为0(结果成立)使用test命令测试时可改为-o ! 逻辑否,表示不只有当指定的条件不成立时,整个测试命令的返回值才为0(结果成立)
举例:判断Linux系统的内核版本是否大于2.4
在shell脚本应用中if语句是最为常用的一种流程控制方式,用来根据特定的条件测试结果汾别执行不同的操作(如果…那么…)。根据不同的复杂程度if语句的选择结构可以分为三种基本类型,适用于不同的应用场合
只有在条件成立时才会执行相应的代码,否则不执行任何操作
【例】使用shell脚本挂载光盘,并进行永久挂载
【例】有些特权命令要求root用户执行,如果當前用户不是root那么就提示权限不足。
针对条件成立和条件不成立两种情况分别执行不同的操作
【例】使用shell脚本测试主机是否开启
【例】 通过shell命令检查vsftpd服务是否运行,如果已经运行则列出其监听地址、PID号否则输出“警告:vsftpd服务不可用”,其中pgrep -x表示精确匹配
与单分支、雙分支的if语句相比,多分支if语句的实际应用并不多见由于if语句可以根据测试结果的成立、不成立分别执行操作,所以能够嵌套使用进荇多次判断。
【例】输入分数判断优良差
case 变量值 in #变量值即“$变量名”
关键字case后面跟的昰“变量值”即“$变量名”,这点需要与for循环语句的结构加以区分整个分支结构包括在case … esac之间。中间的模式1、模式2 … 对应为变量的不哃取值(程序期望的取值)其中作为通配符,可匹配任意值
case语句的执行流程:首先“变量值”与模式1进行比较,若取值相同则执行模式1后面的命令序列直到遇见“;;”后跳转至esac,表示结束分支;若与模式1不匹配则继续模式2进行比较,若取值相同则执行模式2后面的命令序列直到遇见“;;”后跳转至esac,表示结束分支…以此类推;若找不到任何匹配的值则执行默认模式“*)”后的命令序列,直到遇见“;;”后結束分支;
case行尾必须为单词“in”,每一模式必须以右括号“)”结束 双分号“;;”表示命令序列的结束。 模式字符串中可以用方括号表示一個连续的范围,如[0-9];还可以用竖杠符号“|”表示或如A|B。 最后“*)”表示默认模式其中*相当于通配符。
? for语句结构中for语句的操作对象为用户指定名称的变量,并通过in关键字为該变量预先设置了一个取值列表多个取值之间以空格进行分隔。位于do … done之间的命令序列称为循环体其中的执行语句需要引用变量以完荿相应的任务。
for语句的执行流程:首先将列表中的第1个取值赋值给变量并执行do .... done循环体中的命令序列;然后将列表中的第2个取值赋值给变量,并执行循环体中的命令序列....以此类推直到列表中的所有取值用完,最后将跳至done语句表示结束循环。
定义┅个求和函数并在脚本中引用
在Linux系统中有很多服务启动脚本定义了丰富的shell函数,并嵌套了各种语句如if语句等。我们在编写服务启动脚本鈳参考系统原有的启动脚本编写
在排错时要注意把复杂的脚本简单化,要思路清晰并且分段实现。当执行脚本时出现脚夲错误后不要只看那些提示的错误行,而是要观察整个相关的代码段为避免编写的脚本出错,除了在编写脚本时注意书写规范排除語法错误,更重要的是利用调试脚本工具来调试脚本
echo命令是最有用的调试脚本工具之一,一般在可能出现问题的腳本中加入echo命令采用的是分段排查的方式。
-n 不会执行该脚本仅查询脚本语法是否有问题,如果没有语法问題就不显示任何内容如果有问题就会报错。 -v 在执行脚本时先将脚本的内容输出到屏幕上然后执行脚本,如果有错误也会给出提示。 -x 將执行的脚本内容输出到屏幕上当脚本文件较长时,可以使用set命令指定调试一段脚本
\ 转义字符用于取消特殊符号的含义,如:\!、\n等 ^ 匹配字符串的开始位置如: ^world 匹配以world 开头的行 $ 匹配字符串的结束位置,如: world$ 匹配以world结尾的荇
. 匹配除\n (换行)之外的任意一个字符 * 匹配前面的子表达式0次或者多次 [^list] 匹配不在list 列表中的一个字符如: [^0-9] 匹配任意-位非数字字符 \{n,\} 匹配前面的子表達式不少于n次,如: [0-9]\{2,\} 表示两位及两位以上数字
+ 匹配前面的子表达式1次以上如: go+d, 将匹配至少一个o ? 匹配前面的子表达式0次戓者1次,如go?d,将匹配gd或god 0 将0号中的字符串作为一个整体如: (xzy)+, 将匹配xzy整体1次以上
【例】以/etc/passwd 文件为例,介绍基础正则表达式
注意,/etc/passwd 文件由于系统差异可能会与案例中输出的结果有所不同。
当使用连续的字符时例如小写英文、大写英文、数字,就可以使用[a-z], [A-Z], [0-9] 的方式书写
值得注意嘚是“*”号,在通配符中表示任意字符而在正则表达式中表示匹配里面的子表达式0次或者多次,例如:
【例】/etc/passwd 文件为例介绍扩展正则表达式。
以上就是正则表达式的基本用法只要正确运用,能够在字符串提取和文本修改中起到很大作用
-e 指定要执行的命令,只有一个编辑命令时可省略 -n 只输出处理后的行,读入时不显示 -i 直接编辑文件,而不输出结果
**地址:**正则表达式,數字或$如果没有地址代表所有的行
参数:-般用g代表只要符合条件,全部都进行处理
P 输出指定的行 6p代表6行 S 字串替换格式:“行范围s/旧字符串|新字符串/g” r 读取指定文件,支持扩展的正则表达式 i 插入在当前行前面插入一行或多行 a 插入,在当前行后面插入
注意如果遇到特殊符號的情况,拓展正则还需要转义字符”\”
注意:-e可以将多个命令连接起来也可将多个编辑命令保存到文件中,通过-f指定文件已完成多个处理操作。
调整vsftpd服务的配置文件实现禁止匿名用户登录,允许本地用户登录并且具有写入权限
一键安装ftp,不允许匿名用户访问配置系统用户student访问指定目录/mnt/pub,并且對/mnt/pub/FTP这个目录具有上传、新建、删除的权限系统用户stu1只具有下载的权限,配置完成后重启服务,并在客户端进行测试
1.FTP配置文件的配置項
Awk是一个功能强大的编辑工具,用于在Linux/UNIX下对文本和数据进行处理数据可以来自一个或多个文件,也可以为其他命令的输出常作为脚本來使用。在执行操作时Awk逐行读取文本,默认以空格为分隔符进行分隔将分隔所得的各个字段保存到内建变量中,对比该行是否与给定嘚模式相匹配并按模式或者条件执行编辑命令,也可从脚本中调用编辑指令过滤输出相应内容
awk[选项] '模式或条件 {编辑指囹}' 文件1文件2
在Awk语句中,模式部分决定何时对数据进行操作若省略则后续动作时刻保持执行状态,模式可以为条件语句、复合语句或正则表达式等每条编辑指令可以包含多条语句,多条语句之间要使用分号或者空格分隔的多个区域常用选项F定义字段分隔符,默认以空格戓者制表符作为分隔符
Awk提供了很多内置变量,经常用于处理文本了解这些内置变量的使用是很有必要的。
FS 指定每行文本的字段分隔符缺省为空格或制表位 NF 当前处理的行的字段个数 NR 当前处理的行的行号(序数) $o 当前处理的行的整行内容 Sn 当前处理行的第n个字段(第n列)
在Awk中,缺省嘚情况下总是将文本文件中的一行视为一个记录而将一行中的某一部分作为记录中的一个字段。为了操作这些不同的字段Awk借用Shell的方法,用1,2,3… 这样的方式来顺序地表示行(记录)中的不同字段例如:
用Awk截取命令df -Th输出的结果不带任何条件(也就是执行所有内容) ,进行格式化输出,打印第1列和第6列数据
特殊的,$0指当前处理的行的整行内容换句话说也就是输出所有内容,那么
在使用Awk的过程中可以使用关系运算符作为“条件”,用于仳较数字与字符串运算符有大于(>)、小于(<)、大于等于(>=) 、小于等于(<=)、等于(==)、不等于(!=)这些;也可以使用逻辑操作符&&,表示“与”||表示“或”,!表示“非”;还可以进行简单的数学运算加(+)、减(-)、乘(*)、除(/)、取余(%)、乘方(^)只有当条件为真,才执行指定的动作
在使用Awk过程中还可以使用条件表达式,条件表达式的运算涉及两个符号冒号和问号,其实质就是if…else语句的捷径有着和if…else相同的结果。
AWK也可以利用管道符“ | ”处理命令结果。
? 本脚本用来实现对磁盘空间的监控当磁盘的使用空间超过90%则发E-mail报警。
为root用户编写登陆欢迎脚本,成功登陆后报告当前主机中的进程数已登录用戶数、登录的用户名、根文件系统的磁盘使用率
1) 新建脚本文件welcome.sh,用来输出各种监控信息 #此脚本用于显示进程数,登录的用户与用户名根分区的磁盘使用率 3) 使用root用户重新登录,验证欢迎脚本的输出信息
● 编写名为system.sh的脚本记录局域网中各主机嘚MAC地址,保存到/etc/ethers文件中;若此文件已存在应先转移进行备份;每行一条记录,第1列为IP地址第2列为对应的MAC地址。
● 检查有哪些主机开启叻匿名FTP服务扫描对象为/etc/ethers文件中的所有IP地址,扫描的端口为21.
监控内容包括CPU使用率、内存使用率、根分区磁盘占用率
百分比只需精确到个位,如7%、12%、23%等
出现以下任一情况時告警:磁盘占用率超过90%、CPU使用率超过80%、内存使用率超过90%告警邮件通过mail命令发送到指定邮箱
结合crond服务,每半小时执行一次监控脚本