【●】Shell脚本编辑
一、shell环境及特性
1.shell
●在linux内核与用户之间的解释器程序
—通常指 /bin/bash
—负责向内核翻译及传送用户/程序指令
—相当于系统的“外壳”
2.shell的使用方式
●交互式 ——命令行
—人工干预、智能化程度高
—逐条解释执行、效率低
●非交互式 ——脚本
—需要提前设计、智能化难度大
—批量执行、效率高
—方便在后台静悄悄地运行
3.常见的shell程序种类
如何切换shell环境
—通过usermod、chsh更换登录shell
—手动执行目标shell程序
用户(root)---bash---sh
●cat /etc/shells # 查看系统中所有的解释器
[root@svr7 ~]# cat /etc/shells
/bin/sh #多数Unix默认的shell
/bin/bash #多数linux默认使用的shell
/sbin/nologin #非登录shell
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
4.Bash基本特性
●命令行环境回顾
—tab键补全、历史命令、 快捷键、别名、重定向、管道符(管道操作)
二、脚本构成及执行
1.shell脚本
●提前写好可执行语句,能够完成特定任务的文件
—顺序、批量化处理
—解释型程序
2.规范的脚本构成
—声明解释器
# !/bin/bash(使用哪种解释器 、写在脚本第一行)
—编写注释
#编写步骤、思路、脚本功能、作者信息、变量作用等内容
—执行指令
[root@svr7 ~]# vim /root/first.sh
#!/bin/bash
#这是第一个测试脚本
echo "Hellow World"
echo "abc"
3.脚本创建“三步走”
—1. 新建文本文件
—2. 添加可执行的脚本语句(命令行)
—3. 添加 x 执行权限
[root@svr7 ~]# vim /root/first.sh #1.建文件
echo "Hello World" #2.写脚本语句
[root@svr7 ~]#chmod u+x /root/first.sh #3.加执行权限
[root@svr7 ~]# /root/first.sh
Hello World
4.shell脚本执行方式
—1. 添加x权限 ,使用绝对路径或相对路径执行
[root@svr7 opt]# chmod u+x test01.sh
[root@svr7 opt]# /opt/test01.sh
—2. 使用解释器执行脚本,无需x权限(开启子进程,父进程不作任何操作)
[root@svr7 opt]# bash test01.sh
—3.使用source 命令执行脚本,无需x权限(不开启子进程,父进程进行操作)
[root@svr7 opt]# source test01.sh
三、简单脚本应用
1.快速配置yum仓库
[root@svr7 opt]# vim test03.sh
#!/bin/bash
#部署yum仓库
mount /dev/cdrom /mydvd
rm -rf /etc/yum.repos.d/*.repo
echo "[abc]
name=xxx
baseurl=file:///mydvd
enabled=1
gpgcheck=0 " > /etc/yum.repos.d/abc.repo
[root@svr7 opt]# bash test03.sh
[root@svr7 opt]# yum repolist
2.编写脚本,安装http服务,需要开机自启并且主页显示内容为“web-test~~~”
[root@svr7 opt]# vim /opt/test04.sh
#!/bin/bash
yum -y install httpd
echo "web-test~~~" > /var/www/html/index.html #定义主页内容
systemctl restart httpd #开服务
systemctl enable httpd #设置开机自启
之后使用 bash test04.sh 执行脚本
curl 192.168.4.7 可以看到页面内容
◆ 编写脚本,开启ftp服务,并实现开机自启
yum -y install vsftpd &> /dev/null //安装ftp,不显示任何信息,dev下
的null相当于黑洞,不需要的信息都可以扔到里面让其消失。
[root@svr7 opt]# vim test05.sh
#!/bin/bash
yum -y install vsftpd &> /dev/null #装包,忽略输出
systemctl restart vsftpd #起服务
systemctl enable vsftpd #设为开机自运行
[root@svr7 opt]# bash test05.sh
> 正确信息重定向
2> 错误信息重定向
&> 所有信息重定向
四、条件测试,可以为脚本赋予智能判断的效果
● 使用格式:1. test 表达式 2. [表达式]
● 测试方式:
— 1.对字符串进行测试
◆ == 判断两边是否相等 != 判断两边是否不相等
echo $? 查询上条测试是否正确
[root@svr7 opt]# test a == a #使用常量判断,再用echo$?测试结果
[root@svr7 opt]# echo $?
0
[root@svr7 opt]# [ a == a ]
[root@svr7 opt]# echo $?
0
[root@svr7 opt]# test a == b
[root@svr7 opt]# echo $?
1
[root@svr7 opt]# [ a == b ]
[root@svr7 opt]# echo $?
1
[root@svr7 opt]# [ $a == $b ] #使用变量判断两个变量的值是否相等 ,再用echo$?测试结果
[root@svr7 opt]# echo $?
1
[root@svr7 opt]# [ $a != $b ]
[root@svr7 opt]# echo $?
0
◆ -z 判断变量是否为空 ! -z 判断变量是否非空
[root@svr7 opt]# echo $a
2
[root@svr7 opt]# [ -z $a ] #判断变量a是否为空,如果为空则判断正确反 之判断错误
[root@svr7 opt]# echo $?
1
[root@svr7 opt]# [ ! -z $a ] #判断变量a是否有值,有值则判断正确反 之判断错误
[root@svr7 opt]# echo $?
0
— 2.逻辑符号
&&: 之前指令执行成功才会执行之后指令
||: 之前指令执行失败才会执行之后指令
#!/bin/bash
[ $USER == root ] || exit #如果用户不是管理员就退出
[ $USER != root ] || exit #如果用户不是管理员就退出
yum -y install vsftpd
systemctl restart vsftpd
systemctl enable vsftpd
#!/bin/bash
read -p "请输入用户名称:" n
[ -z $n ] && exit #判断用户名为空的话就退出脚本
useradd $n
stty -echo
read -p "请输入密码:" m
stty echo
echo "$m" | passwd --stdin $n
● 上述是1个逻辑符号的使用情况,但有时需求比较复杂可能需要2个逻辑符号组合,那么使用后效果可以按以下方式检测:
◆ touch a b c
◆ ls a && ls b && ls c //结果是都显示,第一个ls执行成功,然后导致第二个ls也执行,并且可以成功,这样的话第一个和第二个任务都成功了,那么这个组合就算成功,然后会导致第二个逻辑符号&&后面的ls c 也执行并且成功。
◆ ls a || ls b || ls c //结果是显示a,第一个ls执行成功,第二个ls就不会执行了,这两个任务中间是|| ,那么只要有一个成功就算这个组合执行成功,由于这个组合算成功,所以就不会执行第二个||后面的任务了
◆ ls a && ls b || ls c //结果是显示a和b,第一个ls执行成功,然后导致第二个ls也执行,并且可以成功,这样的话第一个和第二个任务都成功了,那么这个组合就算成功,但是由于第二个逻辑符号是||,就不会执行最后的ls c任务了
◆ ls a || ls b && ls c //结果是显示a和c,第一个ls执行成功,第二个ls就不会执行了,这两个任务中间是|| ,那么只要有一个成功就算这个组合执行成功,所以就会导致第二个逻辑符号&&后面的ls c执行
◆ 再次修改脚本:
#!/bin/bash
read -p "请输入用户名称:" n
[ -z $n ] && echo "你倒是给个名字阿!" && exit //退出前添加提示
useradd $n
stty -echo
read -p "请输入密码:" m
echo
stty echo
echo "$m" | passwd --stdin $n
—3. 数字
-eq 是否相等 -ne 是否不等 -gt 是否大于 -lt 是否小于
-ge 是否大于等于 -le 是否小于等于
[ 1 -eq 1 ] #判断 1 是否等于 1
[ 3 -ge 5] #判断 3 是否大于等于 1
a=10
b=20
[ $a -ne $b ] #判断变量a 是否不等于变量b
— 4. 文件
-e 判断文件是否存在,若存在则结果为真
-f 判断文件是否存在,必须是普通文件
-d 判断文件是否存在,必须是目录
-r 判断当前用户对文件是否有读权限, 对root无效
-w 判断当前用户对文件是否有写权限, 对root无效
-x 判断当前用户对文件是否有可执行权限, 对root无效(目录是否可以进入)
[root@svr7 opt]# [ -d /etc/hosts ]
[root@svr7 opt]#echo $? #目录/etc/hosts存在,测试成立
0
◆ 编写脚本,每2分钟检查服务器登录账户数量,如果超过3人发邮件通知管理员
[root@svr7 opt]# vim test01.sh
#!/bin/bash
n=$(who | wc -l) #n里面存储了登录数量
[ $n -gt 3 ] && echo "服务器被入侵!狼来了!" | mail -s test root #//用n和3对比,如果超过3就发邮件
[root@svr7 opt]# chmod +x test01.sh #脚本写完后,赋予x权限
[root@svr7 opt]# crontab -e #编写计划任务
*/2 * * * * /opt/test01.sh #每2分钟执行脚本,然后保存退出
只要目前超过3人登录系统,那么每隔2分钟就会收到邮件,使用mail命令查看邮件
[root@svr7 opt]# rm /var/spool/mail/root #清空所有邮件