day01 备份文件
写一个脚本遍历目录下文件
并且将这些文件做一个备份
将备份的文件增加一个年月日的后缀 例如将a.txt备注为a.txt_20040411
#!/bin/bash
hz=`date +%Y%m%d`
for i in `find /date/ -type f -name "*.txt"`
do
echo "copy_files${i}"
cp ${i} ${i}_${hz}
done
day02 批量创建用户
创建十个用户并且设置随机的密码
密码要求包含大小写字母以及数字密码长度15位
#可以使用mkpasswd去创建用户随机密码 记录在/tmp/userinfo.txt
#用户名可以用seq队列去生成
#passwd --stdin user_${i} 可以在创建user密码时只输入一次密码
#!/bin/bash
#先验证是否有密码文件和mkpasswd工具
if [ -f /tmp/userinfo.txt ]
then
rm -rf /tmp/userinfo.txt
fi
if ! which mkpasswd
then
yum -y install expect
fi
#生成00到09 10个数字的队列
for i in `seq -w 0 09`
do
p=`mkpasswd -l 15 -s 0`
useradd user_${i} && echo "${p}"| passwd --stdin user_${i}
echo "user_${i} ${p}" >> /tmp/userinfo.txt
done
day03 磁盘检测脚本
#检测各个挂载点和分区是否正常可以创建和删除文件
#我们可以先将所有的挂载目录取出然后遍历
#然后在挂载目录下面创建并且删除文件以测试健康状况是否良好
#示例代码
#!/bin/bash
#测试脚本 测试磁盘挂载点是否健康
#找到所有的挂载目录
mount_vlous=`df | sed '1d' |grep -v 'tmpfs'|awk '{print $NF}'`
#开始遍历
for i in ${mount_vlous}
do
touch ${i}/testfile && rm -rf ${i}/testfile
if [ $? -ne 0 ]
then echo '磁盘挂载存在问题'
else echo '磁盘挂载状况健康'
fi
done
#值得注意的是此处的-ne代指不等于
day04 检查文件目录权限是否符合
#检查文件权限是否复合以下条件
<<COMMENT
所有文件的权限是644
所有目录的权限是755
文件和目录所有者为www所属组是root
COMMENT
#示例代码
#!/bin/bash
cd /data/test/
# 遍历当前文件夹下面所有文件和目录
for i in $(find .)
do
f_p=$(stat -c %a "$i")
f_u=$(stat -c %U "$i")
f_g=$(stat -c %G "$i")
# 判断是否为目录
if [ -d "$i" ]; then
[ "$f_p" = '755' ] || chmod 755 "$i"
else
[ "$f_p" = '644' ] || chmod 644 "$i"
fi
# 判断当前文件夹下所有文件和目录是否属于www用户和root用户组
[ "$f_u" = 'www' ] || chown www "$i"
[ "$f_g" = 'root' ] || chown :root "$i"
done
#关键知识总结
#查看文件权限 stat -c %a 1.txt
#查看文件所属组 %G
#查看文件所有者 %U
day05 备份文件并且添加软链接
#一个老的文件夹已经满了,新的同类文件存储在一个新的地址,并且将老的文件全部移动到新的文件中去但有些环境变量不易更改,然后还用老的文件地址,需要创建软连接,依旧可以通过老地址访问文件。
#!/bin/bash
main()
{
cd /data/test/
for dir in `ls`
do
for dir2 in `find $dir -maxdepth 1 -type d `
do
if ! which rsync
then yum -y install rsync
fi
rsync -aR $dir2/ /data1/test/
if [ $? -eq 0 ]
then
rm -rf $dir2
echo "/data/test/$dir2 move successfuly"
ln -s /data1/test/$dir2 /data/test/$dir2 $$ \
echo "/data/test/$dir2 create ln"
else
echo "/data/test/$dir not move "
fi
done
done
}
main &> /tmp/move_old_data_`date +%F`.log
day06 监控系统负载
#系统负载命令使用uptime查看,过去一分钟的平均负载 负载超过10就记录
#系统状态使用如下工具标记:top、vmstat、ss
#要求每隔20s监控一次
#输出到/opt/logs下面,文件保留一个月标记明白日期
#!/bin/bash
[ -d /opt/logs ] || mkdir -p /opt/logs
while :
do
load=`uptime | awk -F 'average:' '{print $2}'|cut -d',' -f1|sed 's/ //g' |cut -d'.' -f1`
if [ $load -gt 10 ]
then
top -bn1 |head -n 100 > /opt/logs/top.`date +%s`
vmstat 1 10 > /opt/logs/vmstat.`date +%s`
ss -an > /opt/logs/ss.`date +%s`
fi
sleep 20
find /opt/logs \( -name "top*" -o -name "vmstat*" -o -name "ss*" \) -mtime +30 |xargs rm -f
# find /opt/logs \( -name "top*" -o -name "vmstat*" -o -name "ss*" \) -mtime +30 | xargs rm -f
done
day07 找五分钟内更改过的文件
#找五分钟内更改过的文件将其写入文件中,并且用时间戳作为文件名字
#!/bin/bash
da=`date +%Y%m%d%H%M`
dir=/data/test
find $dir/ -type f -mmin -5 > /tmp/newfiles.txt
if [ -s /tmp/newfiles.txt ];then
mv /tmp/newfiles.txt /tmp/$da
fi
day08 菜单脚本
#输入一个数字会运行对应的一个命令
#1-date 2-ls 3-who 4-pwd
#continue可写可不写
#!/bin/bash
while :
do
read -p "please input number 1-4(5 is exit)" n
case $n in
1)
date
continue
;;
2)
ls
continue
;;
3)
who
continue
;;
4)
pwd
continue
;;
5)
break
;;
*)
echo "wrong you input is not"
;;
esac
day09 输入数字
#要求用户输入数字然后打印数字值 然后再次要求用户输入数值 知到用户输入end
#!/bin/bash
while :
do
read -p 'please write you want a number(input end is exit)' n
num=`echo $n |sed -r 's/[0-9]//g'|wc -c`
if [ $n == "end" ]
then
exit
fi
if [ $num -eq 1 ]
then
echo "you write is correct "
else
echo "you write is error ,please try again"
fi
done
day10 监控站点访问状态
#编写一个系统监控脚本 监控站点访问是否正常
#状态码为2xxor3xx为正常状态
#!/bin/bash
# 检查是否安装了 curl,如果没有则尝试安装
if ! which curl &> /dev/null; then
echo "curl is not installed"
yum -y install curl
if [ $? -ne 0 ]; then
echo "Failed to install curl"
exit 1
fi
fi
# 检测传递的参数数量,如果不是一个则输出错误信息并退出
if [ $# -ne 1 ]; then
echo "Usage: $0 <URL>"
exit 1
fi
# 使用 curl 获取 URL 的状态码
code=$(curl --connect-timeout 3 -I $1 2>/dev/null | grep 'HTTP' | awk '{print $2}')
# 判断状态码是否为 2xx 或 3xx,如果是则输出访问正常的消息,否则输出访问异常的消息
if echo $code | grep -qE '^(2[0-9][0-9]|3[0-9][0-9])'; then
echo "$1 check is ok"
else
echo "$1 check is not ok"
fi