书写脚本规则
1.声明解释器
#!/bin/bash
bash优点: 历史记录,tab,管道,重定向,别名
2. 注释
3. 代码
1.编写一个创建用户的脚本,输入用户名和密码,输入用户名为空,退出脚本
#! /bin/bash
read -p '请输入您要创建的用户名' a
[ -z $a ] && echo "输入用户名为空" && exit //输入为空退出脚本
useradd $a &> /dev/null
echo 用户$a创建成功
stty -echo #关闭回显
read -p '请输入你要设置的密码' b
echo $b | passwd --stdin $a &> /dev/null # /dev/null 系统黑洞
stty echo #开启回显
echo 用户$a密码设置成功
2.编写脚本,实现vsftpd服务的装包配置启服务的全过程,开启上传功能
#!/bin/bash
yum list installed | grep vsftp &> /dev/null #测试是否安装vsftpd服务,安装则退出
[ $? == 0 ] && echo "已安装" && exit
yum -y install vsftpd &>/dev/null #安装vsftpd服务
sed -i 's/^#anon_upload/anon_upload/' /etc/vsftpd/vsftpd.conf #修改配置文件
systemctl restart vsftpd #重启服务
systemctl enable vsftpd #设置开机自启
chmod o+w /var/ftp/pub #给ftp目录权限
systemctl stop firewalld #暂停防火墙
setenforce 0 #暂停selinux
3.编写脚本,每2分钟检查系统登录用户数量,如果超过3人,则发邮件给管理员
#! /bin/bash
a=`who | wc -l` #检测当前登陆人数
[ $a -gt 3 ] && echo "使用人数超过三人." | mail -s test root
[root@ha131 ~]# chmod 755 ceshi.sh
[root@ha131 ~]# crontab -e
*/2 * * * * /root/cehsi.sh #每两分钟执行一次
4.测试网络是否连通
提示:
ping -c 3 ip # ping三次结束
ping -i 0.2 #设置ping速度每次间隔0.2
ping -W 1 #设置返回结果的时间
#! /bin/bash
ping -c 3 -i 0.2 -W 1 www.baidu.com &>/dev/null
if [ $? -eq 0 ];then
echo "无问题"
else
echo "有问题"
fi
5.测试与目标ip是否连通
#! /bin/bash
read -p "输入ip" a
ping -c 3 -i 0.2 -W 1 $a &>/dev/null
if [ $? -eq 0 ];then
echo "$a以连通"
else
echo "$a未连通"
fi
6.for循环 测试与目标ip是否连通
#! /bin/bash
for i in `seq 10` #准备十个值[1~10]
do
ping -c 3 -i 0.2 -W 1 192.168.107.$i &>/dev/null
if [ $? -eq 0 ];then
echo "192.168.107.$i连通"
else
echo "192.168.107.$i未连通"
fi
done
7.猜随机数字
结果:猜大了
猜小了
猜对了
#! /bin/bash
a=$[RANDOM%11]
read -p "请输入一个数字" n
if [ $a -eq $n ];then
echo "猜对了"
elif [ $a -gt $n ];then
echo "猜大了"
else
echo "猜小了"
fi
8.while循环优化猜随机数字
#! /bin/bash
a=$[RANDOM%101]
b=0
echo $a
while :
do
let b++
read -p "请输入一个数字(0~100)" n
if [ $a -eq $n ];then
echo "猜对了,一共猜了$b次"
exit
elif [ $a -gt $n ];then
echo "猜小了"
else
echo "猜大了"
fi
done
9.编写一键安装nginx脚本
确保首先由nginx的安装tar包
本案例使用的为nginx1.20.1版本
#!/bin/bash
yum -y install gcc openssl-devel pcre-devel #安装相应的环境
tar -xf /nginx/nginx-1.20.1.tar.gz -C /nginx/nginx-1.20.1 #解压的目标路径
cd nginx-1.20.1/ #进入目录
./configure #执行安装
make
make install
测试nginx服务,如果电脑中有httpd服务请关闭。
systemctl stop firewalld #先暂停防火墙,防止影响结果
开始测试
测试成功
10.编写一键启动nginx或者关闭脚本
#! /bin/bash
case $1 in
st|start)
netstat -ntulp | grep -q nginx
if [ $? -eq 0 ];then
echo "服务已启动"
else
/usr/local/nginx/sbin/nginx
fi;;
stop)
/usr/local/nginx/sbin/nginx -s stop;;
rest)
/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx;;
*)
echo "st||stop||rest||start"
esac
11.测试当前网段有哪些ip连通
#! /bin/bash
myping(){ #定义shell函数,方便调用
ping -c 1 -W1 $1 &> /dev/null
if [ $? -eq 0 ];then
echo "$1 up"
else
echo "$1 down"
fi
}
for i in {1..254}
do
myping 192.168.108.$i &
done
wait #wait命令作用是等待所有后台进程结束才结束脚本
12.键盘输入数字,输入0结束,求累加和
#! /bin/bash
x=0
while :
do
read -p "输入数字(输入0结束)" n
if [ $n -eq 0 ];then
break
fi
if [ -z $n ];then
echo "请重新输入"
fi
let x+=n
done
echo "累加和为$x"
13.输出20以内6的倍数,加十输出
#! /bin/bash
for i in `seq 20`
do
a=$[i%6]
[ $a -ne 0 ] && continue #如果余数不为0,结束本次循环
echo $[i+10]
done
14.如何得到八位随机字符(随机密码)
#! /bin/bash
a=qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789
for i in {1..8}
do
b=$[RANDOM%62]
c=${a:$b:1}
pass=$pass$c
done
echo $pass
15.优化创建用户脚本(不输入密码,使用默认密码123)
#! /bin/bash
read -p "请输入您要创建的用户名: " a
[ -z $a ] && echo "用户名输入为空" && exit # 输入为空退出脚本
useradd $a &> /dev/null
echo 用户$a创建成功
stty -echo #关闭回显
read -p '请输入你要设置的密码' b
echo ${b:-123} | passwd --stdin $a &> /dev/null
stty echo #开启回显
echo 用户$a密码设置成功
16.使用sed和字符串处理判断yum仓库是否可用(centos7)
#!/bin/bash
a=`yum repolist | sed -n '$p'`
x=`echo ${a#* } | sed 's/,//'`
[ $x -eq 0 ] && echo "yum不可用" && exit || echo "yum可用"
17.sed脚本综合应用
编写一个脚本getpass.sh,实现一下需求
1.找到使用bash作为登录器的用户
2. 列出这些用的shadow密码记录
3. 按每行“用户名–>密码记录”保存到getpass.log中
#!/bin/bash
A=$(sed -n '/bash$/s/:.*//p' /etc/passwd) #找出登录器为bash的用户
for i in $A
do
pass1=$(grep $i /etc/shadow) #找出用户密码的一行
pass2=${pass1#*:} #从左往右删删到第一个:
pass=${pass2%%:*} #从右往左删删到最后一个:
echo "$i --> $pass"
done
18.awk脚本综合应用
编写一个脚本getpass.sh,实现一下需求
1.找到使用bash作为登录器的用户
2. 列出这些用的shadow密码记录
3. 按每行“用户名–>密码记录”保存到getpass.log中
#!/bin/bash
A=`awk -F: '/bash$/{print $1}' /etc/passwd` #首先找到哪些用户使用的解释器是bash,找到这些用户后把名字赋予变量A
for i in $A #把这些找到的用户名轮番交到for循环处理
do
grep $i /etc/shadow | awk -F: '{print $1 "-->" $2}'
#如果第一次循环的账户是root,grep root 可以找到shadow文档中对应的行,包含用户和密码,在使用awk筛选出第一列用户名--->第二列密码
done
19. awk扩展应用
编辑一个脚本,要求显示 cpu平均负载,硬盘空间,网卡流量,安装的软件包数量,账户数量,当前登录的账户数量
uptime | awk '{print"cpu平均负载" $9,$10,$11}'
#free内存信息 free -m 以mb查看
#!/bin/bash
while :
do
echo "###########################"
uptime | awk '{print"cpu平均负载" $9,$10,$11}'
free -m | awk '/^Mem/{print"主机剩余内存"$4"M"}'
df -h | awk '/sda3/{print "主硬盘剩余空间"$4}'
ifconfig ens192 | awk '/RX p/{print "主网卡ens192接受数据量为"$5}'
ifconfig ens192 | awk '/TX p/{print "主网卡ens192发送数据量为"$5}'
A=`rpm -qa |wc -l`
echo "当前主机共安装软件包$A 个 "
awk '{a++} END{print"主机拥有账户" a"个"}' /etc/passwd
x=`who |wc -l`
echo "当前共登录$x个用户"
a=`ps aux |wc -l` #ps aux 查看本机详细的进程
echo "主机运行的进程共有$a个"
echo "################################"
sleep 3
clear
done
21.编写监控脚本,当有人输入本机密码错误超过三次给root发邮件
#!/bin/bash
x=`awk '/Failed/{ip[$11]++} END{for(i in ip){print i","ip[i]}}' /var/log/secure`
for i in $x
do
p=${i%,*} #ip
b=${i#*,} # 输入密码错误的次数
[ $b -gt 3 ] && echo "$p访问本机失败了$b次" | mail -s test1 root
done