1. 编写一个死循环测试脚本
1)执行脚本后打开firefox浏览器,访问http://server0.example.com/
2)如果firefox窗口被关闭,自动重启步骤1
提示:
!!!! 使用 while true 死循环,调用 firefox URL 操作
#!/bin/bash
while true
do
firefox http://192.168.122.37
done
2. 编写序列用户管理脚本
1)编写脚本 uadd.sh,能够批量添加用户 ceshi01、ceshi02、……、ceshi20
2)编写脚本 udel.sh,能够批量删除用户 ceshi01、ceshi02、……、ceshi20
提示:
!!!! 编号小于10的用户的名称前缀为 ceshi0,其余用户的前缀为 ceshi
!!!! 也可以用 seq -w 1 20 生成等宽数列
#!/bin/bash
for i in $(seq -w 1 20)
done
3. 编写脚本 tc.sh,
1)找出/usr/share/doc/下的所有文件
2)如果文件的类型是text,则wc -l统计此文件的行数,显示“文件 xxx,一共 nn 行”
3)最后显示“一共统计了 nn 个文件,累计总行数 nn 行”
提示:
!!!! 使用find命令列出所有目标文件
!!!! 通过“file 文件路径…”检测文件类型,看结果是否出现 text 以便筛选
#!/bin/bash
#记录文件总数的变量
fileNum=0
#当前文件的行数
currentFileRow=0
#所有文件的行数
totalRow=0
for file in $(find /usr/share/doc/ -type f)
if [ $? -eq 0 ];then
fi
done
echo "一共统计了$fileNum
4. 编写脚本 /root/vhost_add,为server0快速添加新的虚拟Web主机
1)虚拟主机的域名由脚本在执行时指定(./vhost_add www0.example.com),若未指定域名,则提示正确用法后退出脚本
2)如果指定FQDN的虚拟主机已经存在,提示“虚拟主机XX已存在”,退出脚本
3)执行脚本后能够向 /etc/httpd/conf.d/vhosts.conf 添加新配置
4)并为此虚拟机建立网页目录 /var/www/FQDN,首页内容为虚拟主机的域名
5)在本机 /etc/hosts 文件末尾追加“172.25.0.11 虚拟Web主机域名”记录
提示:
!!!! 需提前准备好 httpd 服务器
!!!! 通过检查 vhosts.conf 文件是否存在’.*ServerName.*域名.*”记录判断是否存在
!!!! 追加记录用echo ”文件内容” >> 文件路径
#!/bin/bash
if [ $# -eq 0 ];then
exit 1
fi
#判断/etc/httpd/conf.d/vhosts.conf是否存在,不存在则创建
if [ ! -e "/etc/httpd/conf.d/vhosts.conf" ];then
touch /etc/httpd/conf.d/vhosts.conf
fi
#检测虚拟主机是否添加过
egrep ".*ServerName.*$1.*" /etc/httpd/conf.d/vhosts.conf
echo "虚拟主机 $1 已存在"
mkdir /var/www/$firstDomain
echo $1 > ./index.html
DocumentRoot /var/www/$firstDomain
#访问Desktop的虚拟web
firefox $1
- #/bin/bash
- for ip in $(cat /root/shell/Exercise01/ipTexts.txt)
-
do
-
expect << EOF
-
spawn ssh -o StrictHostKeyChecking=no root@$ip
- expect "password" {send "redhat\r"}
- expect "#" {send "wget http://192.168.122.37/a.html -O /tmp/a.html\r"}
- expect "#" {send "exit\r"}
- expect "eof"
- EOF
- done
6. 正则表示式操作练习本案例要求编写脚本实现一键部署Nginx软件(Web服务器):
实现此案例需要按照如下步骤进行。
步骤一:准备工作
1)判断yum源是否可用
通过yum repolist查看软件包数量是否大于0:
2)依赖包
源码安装Nginx需要提前安装依赖包软件gcc,openssl-devel,pcre-devel
步骤二:编写脚本
1)参考脚本内容如下:
#!/bin/bash
yumNum=$(yum repolist | awk '/^repolist/{print $2}' | sed 's/,//')
echo "yum不可用"
exit 1
fi
yum -y install gcc openssl-devel pcre-devel
tar -xf nginx-1.12.2.tar.gz
cd nginx-1.12.2
./configure
make
make install
2)确认安装效果
Nginx默认安装路径为/usr/local/nginx,该目录下会提供4个子目录,分别如下:
/usr/local/nginx/conf 配置文件目录
/usr/local/nginx/html 网站页面目录
/usr/local/nginx/logs Nginx日志目录
/usr/local/nginx/sbin 主程序目录
主程序命令参数:
[root@svr5 ~]# /usr/local/nginx/sbin/nginx //启动服务
[root@svr5 ~]# /usr/local/nginx/sbin/nginx -s stop //关闭服务
[root@svr5 ~]# /usr/local/nginx/sbin/nginx -V //查看软件信息
本案例要求编写Ngin启动脚本,要求如下:
实现此案例需要按照如下步骤进行。
步骤一:编写脚本
脚本通过位置变量1读取用户的操作指令,判断是start、stop、restart还是status。
1)参考脚本内容如下
- #!/bin/bash
- yumNum=1读取用户的操作指令,判断是start、stop、restart还是status。
1)参考脚本内容如下
- #!/bin/bash
- yumNum=(yum repolist | awk ’/^repolist/{print 2}' | sed 's/,//')
- if [2}' | sed 's/,//')
- if [yumNum -le 0];then
-
echo ”yum不可用”
-
exit 1
-
fi
-
yum -y install gcc openssl-devel pcre-devel
-
tar -xf nginx-1.12.2.tar.gz
-
cd nginx-1.12.2
-
./configure
-
make
-
make install
2)执行测试脚本:
-
systemctl status nginx.service
-
systemctl restart nginx.service
-
systemctl enable nginx.service
- 1
3 案例3:编写监控脚本
3.1 问题
本案例要求编写脚本,实现计算机各个性能数据监控的功能,具体监控项目要求如下:
- CPU负载
- 网卡流量
- 内存剩余容量
- 磁盘剩余容量
- 计算机账户数量
- 当前登录账户数量
- 计算机当前开启的进程数量
- 本机已安装的软件包数量
3.2 步骤
实现此案例需要按照如下步骤进行。
步骤一:准备工作
1)查看性能数据的命令
- [root@svr5 ~]# uptime //查看CPU负载
-
15:31:30 //系统当前时间
up 127 days, 3:00 //主机已运行时间,时间越大,说明你的机器越稳定。
1 user //用户连接数,是总连接数而不是用户数
load average: 0.00, 0.00, 0.00 // 系统平均负载,统计最近1,5,15分钟的系统平均负载
- [root@svr5 ~]# ifconfig eth0 //查看网卡流量
- [root@svr5 ~]# free //查看内存信息
- [root@svr5 ~]# df //查看磁盘空间
- [root@svr5 ~]# wc –l /etc/passwd //查看计算机账户数量
- [root@svr5 ~]# who |wc –l //查看登录账户数量
- [root@svr5 ~]# rpm –qa |wc -l //查看已安装软件包数量
步骤二:编写参考脚本
1)脚本内容如下:
[root@svr5 ~]# vim listen.sh
-
#!/bin/bash
-
ip=$(ifconfig eth0 | awk '/inet /{print $2}')
- echo "本机IP地址为:$ip"
-
cpu=$(uptime | awk '{print $10}')
- echo "本机CPU最近5分钟的负载是:$cpu"
-
net_in=$(ifconfig eth0 | awk '/RX p/{print $5}')
- echo "入站网卡流量为$net_in"
-
net_out=$(ifconfig eth0 | awk '/TX p/{print $5}')
- echo "出站网卡流量为$net_out"
-
menFree=$(free | awk '/^Mem/{print $4}')
- echo "内存剩余流量为$menFree"
-
diskFree=$(df | awk '/\/$/{print $4}')
- echo "根分区剩余容量为$diskFree"
-
users=$(cat /etc/passwd | wc -l)
- echo "计算机账户数量为$users 个"
-
loginUsers=$(who | wc -l)
- echo "当前登录账户为$loginUsers"
-
processNum=$(ps -aux | wc -l)
- echo "当前开启的进程数量为$processNum 个"
-
softNum=$(rpm -qa | wc -l)
- echo "本机已安装的软件包有$softNum 个"
- 1
4 案例4:编写安全检测脚本
4.1 问题
本案例要求编写脚本,防止远程ssh暴力破解密码,具体监控项目要求如下:
- 检测ssh登录日志,如果远程登陆账号名错误3次,则屏蔽远程主机的IP
- 检测ssh登录日志,如果远程登陆密码错误3次,则屏蔽远程主机的IP
4.2 步骤
实现此案例需要按照如下步骤进行。
步骤一:准备工作
1)过滤帐户名失败的命令(登陆日志文件为/var/log/secure)
- [root@svr5 ~]# awk ‘/Invalid user/{print 10}'
/var/log/secure2)过滤密码失败的命令
- [root@svr5 ~]# awk '/Failed password/{print $11}' /var/log/secure
步骤二:编写参考脚本
1)脚本内容如下:
[root@svr5 ~]# vim test.sh
- #!/bin/bash
- awk '/Failed password/{print $11}' /var/log/secure | awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' | awk '10}' /var/log/secure
2)过滤密码失败的命令
- [root@svr5 ~]# awk '/Failed password/{print $11}' /var/log/secure
步骤二:编写参考脚本
1)脚本内容如下:
[root@svr5 ~]# vim test.sh
- #!/bin/bash
- awk '/Failed password/{print $11}' /var/log/secure | awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' | awk '1>3{print “远程登录密码错误3次以上的IP:”,2}'
- awk '/Invalid user/{print $10}' /var/log/secure | awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' | awk '2}'
- awk '/Invalid user/{print $10}' /var/log/secure | awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' | awk '1>3{print “远程登录用户错误三次以上的IP:”,2}'
5 案例5:编写进度显示脚本
5.1 问题
本案例要求编写脚本,实现带进程显示的复制脚本,具体要求如下:
- 默认Linux的cp命令不具有进度显示
- 我们需要自己编写脚本实现进度显示
- 可以使用进度条的方式,或者显示百分比的方式
5.2 步骤
实现此案例需要按照如下步骤进行。
步骤一:编写参考脚本
1)脚本内容如下:
[root@svr5 ~]# vim test.sh
- #!/bin/bash
- progress(){
- while :
- do
- echo -ne '\033[43m#\033[0m'
- sleep 0.3
- done
- }
- progress &
- cp -r 2}'
5 案例5:编写进度显示脚本
5.1 问题
本案例要求编写脚本,实现带进程显示的复制脚本,具体要求如下:
- 默认Linux的cp命令不具有进度显示
- 我们需要自己编写脚本实现进度显示
- 可以使用进度条的方式,或者显示百分比的方式
5.2 步骤
实现此案例需要按照如下步骤进行。
步骤一:编写参考脚本
1)脚本内容如下:
[root@svr5 ~]# vim test.sh
- #!/bin/bash
- progress(){
- while :
- do
- echo -ne '\033[43m#\033[0m'
- sleep 0.3
- done
- }
- progress &
- cp -r 12
kill
2知识总结
if [ i==2];then
fi
casei==2];thenfi
case1 in
环境变量
USER USER UID PATH
if[PATH
if[USER == “root” ];then
fi
# 位置变量个数
# 位置变量个数
* 所有的位置参数
?存放上一次执行命令的结果
if[?存放上一次执行命令的结果
if[? -eq 0 ];then
fi
循环
(for循环,列表循环:次数是固定的)
for i in 值1 值2 值3
do
命令
done
(while循环,条件循环:次数不是固定的)
while 条件
do
命令
[ let i++ ]
done
函数
cecho(){
echo -e “\033[1m1m2\033[0m”
}
cecho 32 OK
cecho 33 OK
区分 ” ”” “
“ ”: 引用整体,不屏蔽特殊符号含义 (“” 和 ‘’只有包含特殊符号才有区别,其他情况没有任何区别)
echo “a b”
echo a b
”: 引用整体,屏蔽特殊符号含义
echo ‘a b’
echo a b
“ :里面放命令,返回执行结果
():放命令
():放命令
[]:计算
{}: awk
sed 3p
sed和awk
sed: vim 编辑文件
awk: grep 过滤文件
tr ‘[a-z]’ ‘[A-Z]’ < test.txt
tr a b < 文件
将竖的输出结果转换成横的
seq 10 | tr ‘\n’ ’ ‘
字符串比较
== != -z
read -p “输入用户名:” user
if [ -z user] && exit
expect
expect << EOF
spawn ssh -o StrictHost..
expect "password" {send "xx\n"}
expect "#" {send "xx\n"}
EOF
vim 1.txt & 不影响其他命令的执行
kill后面只能加ID号
user] && exit
expect
expect << EOF
spawn ssh -o StrictHost..
expect "password" {send "xx\n"}
expect "#" {send "xx\n"}
EOF
vim 1.txt & 不影响其他命令的执行
kill后面只能加ID号
!最后一个后台进程的id号