1. 书写脚本,批量添加用户
1.新增脚本user.sh
2.通过交互获取需要创建的用户数量
3.批量添加用户
4.要求添加用户前判断用户是否存在,存在的话则跳过,否则增加该用户
5.使用“用户名_123”作为用户的密码
6.用户增加成功显示“用户增加成功”
7.用户添加失败提示“用户添加失败”
8.提取新增用户的用户名,保存在/root/user_name文件中
在脚本的最后将所有新增的用户名进行显示
vim a.sh
#!/bin/bash
name="user"
read -p "通过交互获取需要创建的用户数量:" num
for i in `seq $num`
do
id -u $name$i &> /dev/null 2&>1 -----2>&1 的意思就是将标准错误重定向到标准输出。这里标准输出已经重定向到了 /dev/null。那么标准错误也会输出到/dev/null
if [ $? -eq 0 ]; then
echo "用户已存在,跳过"
else
echo "用户不存在,现在开始创建。。。"
useradd $name$i;echo "$name$i_123"|passwd --stdin $name$i
id -u $name$i &> /dev/null
if [ $? -eq 0 ]; then
echo "用户创建成功"
else
echo "用户创建失败"
fi
echo $name$i >> /root/user_name
echo "显示所有新增用户"
cat /root/user_name
fi
done
chmod +x a.sh
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200925201011897.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTg0MjAxNA==,size_16,color_FFFFFF,t_70#pic_center)
2. 根据要求判断文件类型
1.通过交互判断文件类型
2.提示用户输入一个文件的绝对路径
3.将用户输入的内容保存在一个file_name变量中
4.判断输入的路径所代表的文件是否存在)
5.如果不存在则显示“文件名 文件不存在”的信息
6.如果存在,则判断是否为普通文件,是则显示“文件名 是普通文件”
7.如果不是普通文件,再判断是否为目录,是则显示“文件名 是目录”
8.如果不是目录,再判断是否为链接文件,是则显示“文件名 是链接文件”
如果以上都不是,则显示“文件名 是其他文件类型”
vim b.sh
#!/bin/bash
while :
do
read -p "提示用户输入一个文件的绝对路径:" path
if [ -e $path ]; then
echo "文件存在"
if [ -L $path ]; then
echo "$path是链接文件"
elif [ -f $path ]; then
echo "$path是普通文件"
elif [ -d $path ]; then
echo "$path是目录文件"
else
echo "$path是其他文件"
fi
else
echo "文件不存在"
fi
done
chmod +x b.sh
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200925202408950.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTg0MjAxNA==,size_16,color_FFFFFF,t_70#pic_center)
3. 根据要求搜集服务器系统信息
1.显示出主机名
2.将主机名保存在host_name变量中
3.提取操作系统的ip地址
4.将提取的ip地址保存在host_ip变量中
5.提取出网卡的MAC地址
6.将提取的MAC保存在host_mac中
7.提取出系统的子网掩码
将提取的子网掩码保存在host_mask变量中
vim c.sh
#!/bin/bash
case $1 in
1)
hostname_name=$(hostname)
echo "主机名:${hostname_name}"
;;
2)
host_ip=$(ifconfig eth0|awk '/Mask/ {print $2}'|awk -F ':' '{print $2}')
echo "ip地址:${host_ip}"
;;
3)
host_mask=$(ifconfig eth0|awk '/Mask/ {print $4}'|awk -F ':' '{print $2}')
echo "子网掩码:${host_mask}"
;;
4)
host_mac=$(ifconfig eth0|awk '/HWaddr/ {print $5}')
echo "MAC地址:${host_mac}"
;;
esac
chmod +x c.sh
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200925205610639.png#pic_center)
4. 检测磁盘使用率
要求: 对Linux系统进行判断,centos6的系统执行lv6.sh , centos7的系统执行lv7.sh,脚本中需要判断当前使用率,如果
i
p
服
务
器
大
于
90
ip服务器大于90%,邮件告警,不超过90%,在公屏提示,
ip服务器大于90IP服务器磁盘正常
- 1.能够写出检测系统版本号的脚本
- 2.能够截取到本机ip
- 3.能够截取到当前服务器的磁盘使用率
- 4.能够读取文件中的ip,并判断对应ip的使用率是否大于90%
- 5.大于百分之90的服务器正确发送邮件成功(需要提前测试是否能够正常发邮件)
- 6.不大于90%的ip服务器的磁盘,提示 $IP磁盘正常。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200925210058502.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTg0MjAxNA==,size_16,color_FFFFFF,t_70#pic_center)
5. 检测url是否正常
判断一个网站的状态码,并截取状态码,判断状态码是否为200
url为对应的网址,测试可以使用www.baidu.com. 异常网址可以用www.linuxpm.com
- 1.使用函数
- 2.可以截取到访问网站的状态码
- 3.判断状态码是否为200
- 4.若状态码不为200,则发邮件提醒
u
r
l
异
常
,
状
态
码
为
:
url异常,状态码为:
url异常,状态码为:code
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201017101100885.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTg0MjAxNA==,size_16,color_FFFFFF,t_70#pic_center)
对监测网站地址是否存活
#!/bin/bash
url="http://192.168.194.130/index.html"
http_code=$(curl -Is -o /dev/null -w %{http_code} $url)
check_code(){
if [ $http_code -eq 200 ]; then
echo "$url 存活"
else
echo "$url 站点不可访问"
fi
}
check_code
6. 防止文件被误删除的脚本
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201017101915390.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTg0MjAxNA==,size_16,color_FFFFFF,t_70#pic_center)
使用脚本删除一个文件,首先判断文件是否存在,如果存在则提示是否真要删除,用户输入y|n, 若确定要删除,则安装rsync并测试rsync是否安装成功, 若成功则使用rsync备份文件,备份成功后使用再开始删除数据,删除完成后提示,若想恢复数据,可以到备份路径恢复。
- 1.判断要删除的文件是否存在,不存在则创建
- 2.确认是否删除文件,若删除输入Y,不删除输入N
- 3.在用户输入Y或者N的时候,实现不区分大小写都可以成功,即:Y,y均可
- 4.使用脚本正确安装rsync并启动
- 5.能够判断rsync是否安装成功
- 6.Rsync备份成功
- 7.再次提示是否删除数据,若删除输入Y,不删除输入y
- 8.若确定删除,使用rm 删除文件
- 9.删除完成后,提示要想恢复可以进入备份路径,并列出备份路径
- 10.脚本写完后,完整的截图放在本小题下,本题是一个脚本,不要拆分成多个脚本。
#!/bin/bash
while :
do
read -p "请输入您想要删除的文件:<<" file
echo "您想要删除的文件是:$file"
read -p "确认要删除吗?(Y/N)" cmd1
case $cmd1 in
Y|y)
if [ -e $file ]; then
count=$(rpm -qa |grep rsync|wc -l)
if [ $count -ne 0 ]; then
echo "rsync 已经安装了"
else
yum -y install rsync
fi
netstat -lptnu|grep 873
if [ $? -eq 0 ]; then
echo "rsync service 已经运行了"
else
systemctl start rsyncd
fi
#开始备份文件
backup_dir="/usr/local/src/backup"
[ -d ${backup_dir} ] || mkdir ${backup_dir}
#开始执行备份操作:
rsync -av /root/a ${backup_dir}
echo "input Y:delete!"
echo "input y:no delete!"
read -p "您是否真的真的要删我?(Y|y):<<" cmd2
case $cmd2 in
Y)
echo "start 删除文件:$file"
rm -rf $file
echo "文件恢复路径:${backup_dir}"
;;
y)
echo "no delete"
exit
;;
esac
else
echo "start touch file:$file"
touch $file
exit
fi
;;
N|n)
echo "不删除$file"
exit
;;
esac
done
或
#!/bin/bash
read -p "是否确认删除?(Y/n)" value
file(){
echo "要删除的文件是$files"
if [ -e $files ]; then
rsync -avx $files /opt/ &> /dev/null
rm -rf $files
echo "删除完毕!(恢复路径/opt/)"
else
echo "要删除文件不存在"
fi
}
case $value in
Y|y)
if [ $(rpm -qa |grep rsync |wc -l) -eq 0 ]; then
echo "正在安装rsync"
yum -y install rsync &> /dev/null
echo "安装成功!"
echo "开始执行删除。。。"
files=$1
file
else
echo "rsync存在,开始删除"
rpm -e rsync
yum -y install rsync &> /dev/null
files=$1
file
fi
;;
N|n)
echo "欢迎下次使用"
;;
esac
7. shell入侵检测和邮件报警
1. MD5sum校验
#!/bin/bash
webdir=/var/www/html
#方法1:MD5sum校验
cd $webdir
#md5sum /var/www/html/index.html > /opt/webfile.db
md5dum -c --quiet /opt/webfile.db
if [ $? -eq 0 ]; then
echo "web file is ok"
else
echo ""
#mail -s "web file is change!" 1329826156@qq.com
fi
例子:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201017103550371.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTg0MjAxNA==,size_16,color_FFFFFF,t_70#pic_center)
2. web目录下文件数是否有变动
#!/bin/bash
#方法2:web目录下文件数是否有变动
#find /var/www/html -type f > /opt/countfile.db_sec
find /var/www/html -type f > /opt/countfile.db
count=`diff /opt/countfile.db*|wc -l`
if [ $count -gt 0 ]; then
echo "the file_count is changed"
#mail -s "count_err" 1329826156@qq.com
else
echo "ok"
fi
例子:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201017103846305.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTg0MjAxNA==,size_16,color_FFFFFF,t_70#pic_center)
3. 检测/var/www/html下所有文件
cd /var/www/html
touch wg{1..10}
for i in $(find /var/www/html/ -type f); do echo $i > $i; done
for i in $(find /var/www/html/ -type f); do md5sum $i; done
#!/bin/bash
#获取校验库,只需在首次执行时获取
#for i in $(find /var/www/html/ -type f)
#do
# md5sum $i >> md5db
#done
#通过校验库检查文件的md5值时候有更改,如有更改返回值为非0,触发邮件通知
md5sum -c md5db
if [ $? -ne 0 ]; then
echo "有更改"
message=$(md5sum -c md5db | grep "失败")
mail.py 1329826156@qq.com "警告" "$message"
fi
4. 检测/etc/passwd是否有变化
[root@localhost ~]# yum -y install mailx -----安装邮件服务
[root@localhost ~]# vim /etc/mail.rc -----在文件最小面添加
set from=1329826156@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=1329826156@qq.com
set smtp-auth-password=jphbuvhsukqphhfa
set smtp-auth=login
#!/bin/bash
md5sum /etc/passwd > /tmp/md5_test
md5sum -c /tmp/md5_test
if [ $? -eq 0 ]; then
echo "文件未被入侵"
else
echo "文件已被入侵,请注意"
mail -s "文件已被篡改" 1329826156@qq.com
fi
7. 监控系统
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200928153850623.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTg0MjAxNA==,size_16,color_FFFFFF,t_70#pic_center)
写一个zabbix安装导航脚本,执行后提示用户: 是否安装zabbix。 若用户输入N/n , 均退出系统。 若用户输入Y/y ,都会执行下一步提示,比如 提示用户:请选择以下选项 1. 安装apache, 2. 安装mysql
当用户选择了1或者2 选项后,开始安装相应的服务?
- 1.提示用户选择则是否安装zabbix
- 2.能够实现输入Y/N y/n ,不区分大小写;
- 3.当用户输入1时,先检测有没有apache,若有提示apache已存在,无需再次?
- 4.若没有apache,则提示,系统中没有安装apache,现在开始安装
- 5.安装成功后,列出运行端口
- 6.若用户输入2,则检测是否有mysql,若有mysql,提示mysql已安装,无需再次安装
- 7.若没有mysql则进行安装,安装启动成功后,输出端口
#!/bin/bash
read -p "您是否需要安装zabbix服务:<<" cmd1
case $cmd1 in
y|Y)
echo "开始安装服务....."
echo "1:apache"
echo "2:mysql"
read -p "您需要安装的服务是:<<" cmd2
case $cmd2 in
1)
echo "您现在安装的服务是:apache"
rpm -qa |grep httpd
if [ $? -eq 0 ]; then
echo "apache 已经安装了"
else
yum -y install httpd
fi
netstat -lptnu|grep 80
if [ $? -eq 0 ]; then
echo "apache 服务已经开启了"
else
echo "开启apache服务"
systemctl start httpd
fi
2)
echo "您现在安装的服务是:db"
grep 7 /etc/redhat-release
if [ $? -eq 0 ]; then
echo "您的操作系统是:7"
yum -y install maraidb-server
else
yum -y install mysql-server
fi
;;
esac
;;
n/N)
exit
;;
esac
8. 日志清理
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020101315171544.png#pic_center)
1、编写脚本
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201013151737206.png#pic_center)
2、计划任务
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201013151745174.png#pic_center)
9. Shell解决doss攻击方案
#!/bin/bash
#找出访问最多的IP地址
drop_ip=`cat /var/log/httpd/access_log|grep -v "::1"|awk '{print $1}'|sort -rg|uniq|head -n 10`
#循环写防火墙规则
for i in `cat drop_ip`
do
if [ [ $i =~ "192.168" ] ]; then
echo ""
else
iptables -t filter -I INPUT -s $i -j DROP
fi
done
通过封禁ip来解决ddos
- 获取连接数最多的前10个ip并临时写入文件dropip中
- 通过for循环来遍历dropip文件的ip
- 排除192.168开头和127.0开头的ip
- 然后遍历及排除完3题的ip后调用防火墙drop掉
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201111153329343.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTg0MjAxNA==,size_16,color_FFFFFF,t_70#pic_center)
11. 写一个学员管理系统,实现增加学员,删除学员,修改学员姓名,随机点名的功能
vim a.sh #编辑脚本
#!/bin/bash
while :
do
echo "学生随机点名系统"
echo "1. 添加学员名单"
echo "2. 遍历学员名单"
echo "3. 随机点名"
echo "4. 删除某个学员的信息"
echo "5. 退出"
read -p "请输入你要选择的序号:" num
case $num in
1)
read -p "添加学员" cmd1
echo $cmd1 >> /tmp/name
;;
2)
for i in `seq $(cat /tmp/name|wc -l)`
do
sed -n ${i}p /tmp/name
done
;;
3)
name=`cat /tmp/name|wc -l`
sj=$((RANDOM%$name+1))
sed -n ${sj}p /tmp/name
;;
4)
read -p "请输入要删除的名单" cmd2
sed -i "/${cmd2}/d" /tmp/name
;;
5)
exit
;;
esac
done
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201028170145430.png#pic_center)
12. MySQL备份脚本
- 使用数组保存要备份的数据库:slave_test、bw_edu、mysql
- 定义数据库备份函数,函数通过传参获取要备份的数据库,函数中为备份数据库的操作
- 生成的备份文件要保存在/home/mysql/data_backup目录下,同时生成的备份文件格式为: wg_2020-10-01.sql 文件要有时间戳!
- 使用for循环遍历数组,完成数据库的备份
脚本自动删除30天以前的备份文件
[root@localhost scripts]# vim mysql_backup.sh
#!/bin/bash
#定义数组
db=(bw wg rg)
#定义时间戳
date_time=$(date +%F)
#检测备份目录是否存在,不存在则创建
[ -d /home/mysql/data_backup/$date_time ] || mkdir -p /home/mysql/data_backup/$date_time
#定义备份函数
backup_db(){
mysqldump -B $1 > /home/mysql/data_backup/$date_time/$1.sql
}
#遍历数组,执行备份
for i in ${db[@]}
do
backup_db $i
done
#删除30天过期文件
find /home/mysql/data_backup/ -mtime +30 -exec rm -f {} \;
13. MySQL主从状态监控脚本
- 获取slave的SQL线程和IO线程的状态
- 判断两个线程的状态来判断同步是否正常
- 同步异常时触发邮件报警
[root@localhost scripts]# vim check_slave.sh
#!/bin/bash
IO=$(mysql -e 'show slave status \G;'|awk '/Slave_IO_Running/{print $2}')
SQL=$(mysql -e 'show slave status \G;'|awk '/Slave_SQL_Running/{print $2}')
DATE_TIME=$(date +%F_%T)
R_USER=1329826156@qq.com
if [ $IO == "No" -o $SQL == "No" ]; then
mail.py $R_USER "mysql警告" "$DATE_TIME $HOSTNAME slave 同步异常"
fi
14 . 系统加固脚本
- 用户的密码必须要包含:大小写字母、数字、特殊符号
- 用户的密码长度不少于10位
- 用户密码的过期时间:30天
- 密码过期前8天提醒用户
- 用户密码输入错误3次后,锁定用户10分钟
- 用户1分钟内没有操作,自动注销!
#!/bin/bash
#增加备用的root用户
#新建用户的密码复杂度、长度
pw_file=/etc/security/pwquality.conf
login_file=/etc/login.defs
auth_file=/etc/pam.d/system-auth
#备份配置文件
cp $pw_file $pw_file.bak
cp $login_file $login_file.bak
cp $auth_file $auth_file.bak
#修改密码长度为10位
echo minlen = 11 > /etc/security/pwquality.conf
#新建密码至少包含1个数字
echo dcredit = -1 >> /etc/security/pwquality.conf
#新建密码至少包含1个小写字母
echo lcredit = -1 >> /etc/security/pwquality.conf
#新建密码至少包含1个大写字母
echo ucredit = -1 >> /etc/security/pwquality.conf
#新建密码至少包含1个特殊字符
echo ocredit = -1 >> /etc/security/pwquality.conf
#密码过期时间30天
sed -i '/PASS_MAX_DAYS/s/99999/30/' $login_file
#过期前7天通知用户
sed -i '/PASS_WARN_AGE/s/7/8/' $login_file
#用户输入密码错误3次,封锁用户10分钟
grep -q 'pam_tally2.so' /etc/pam.d/system-auth
if [ $? -ne 0 ];then
echo 'auth required pam_tally2.so deny=3 unlock_time=300 even_deny_root root_unlock_time=300' >> /etc/pam.d/system-auth
fi
#用户10秒没有操作,则退出终端
grep -q 'TMOUT' /etc/profile || echo "export 'TMOUT=10'" >> /etc/profile
15. 打印菱形
vim a.sh
read -p "input the length: " n
for i in `seq 1 $n`
do
for ((j=$n;j>=$i;j--))
do
echo -n " "
done
for((m=1;m<=$i;m++))
do
echo -n "* "
done
echo
done
for i in `seq 1 $n`
do
for((j=0;j<=$i;j++))
do
echo -n " "
done
for((k=$i;k<$n;k++))
do
echo -n "* "
done
echo
done