0、编写一个变量文件/etc/profile.d/color.sh 定义以下颜色变量:RED BULE GREEN YELLOW END
[root@rocky8 ~]# cat /etc/profile.d/color.sh
#!/bin/bash
RED='\033[1;31m'
GREEN='\033[1;32m'
YELLOW='\033[1;33m'
BLUE='\033[1;34m'
PURPLE='\033[1;35m'
CYAN='\033[1;36m'
WHITE='\033[1;37m'
RAN="\033[1;$[RANDOM%6+31]m"
END='\033[0m'
1、编写脚本 systeminfo.sh,显示当前主机系统信息,包括:主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小
#!/bin/bash
. /etc/profile.d/color.sh
echo -e "${CYAN}Hostname:${END}${RAN}$(hostname)${END}"
echo -e "${CYAN}IP: ${END}${RAN}$(hostname -I)${END}"
echo -e "${CYAN}Release: ${END}${RAN}$(cat /etc/os-release |head -n 2 |cut -d '"' -f2|xargs)${END}"
echo -e "${CYAN}Kernel: ${END}${RAN}$(uname -r)${END}"
echo -e "${CYAN}CPU: ${END}${RAN}$(lscpu|sed -rn 's/^Model name:[[:space:]]+([^[:space:]]+)/\1/p')${END}"
echo -e "${CYAN}Mem: ${END}${RAN}$(lsmem | sed -rn 's/^Total online.*([0-9]+.*)/\1/p')${END}"
echo -e "${CYAN}Disk: ${END}${RAN}$(lsblk |sed -rn 's/^sda.* ([0-9]+G).*/\1/p')${END}"
2、编写脚本 backup.sh,可实现每日将 /etc/ 目录备份到 /backup/etcYYYY-mm-dd中
#!/bin/bash
. /etc/profile.d/color.sh
DIR="/backup/etc`date +%F`"
[ -e $DIR ] || mkdir -p $DIR
cp -av /etc/ $DIR && echo -e "${GREEN}备份成功${END}" || echo -e "${RED}备份失败${END}"
[root@rocky8 scripts]# crontab -l
0 0 * * * /root/scripts/backup.sh
3、编写脚本 disk.sh,显示当前硬盘分区中空间利用率最大的值
#!/bin/bash
. /etc/profile.d/color.sh
Disk="`df | sed -rn 's#^/dev/sd.* ([0-9]{1,3}%).*#\1#p'|sort -rn |head -1`"
echo -e "${GREEN}Disk Used:${END} ${RAN}${Disk}${END}"
4、编写脚本 links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序
[root@rocky8 scripts]# cat links.sh
#!/bin/bash
. /etc/profile.d/color.sh
Links=$(ss -nt |egrep '^ESTAB'|tr -s " " :|cut -d: -f6|sort |uniq -c|sort -rn)
printf '%-5s %-20s \n' count links
printf "%-5s %-20s \n" ${Links}
[root@rocky8 scripts]# ./links.sh
count links
2 172.20.0.27
1 10.0.0.1
5、编写脚本rm.sh,实现替代rm命令,将所有删除的文件移动到tmp-年月日-时分秒的目录。
[root@rocky8 scripts]# cat rm.sh
#!/bin/bash
DIR=/tmp/`date +%F-%T`
[ -e $DIR ] || mkdir -p $DIR
path="`pwd`/$1:$DIR"
mv $1 $DIR && echo "$path" |tee path.log
[root@rocky8 scripts]# alias rm=/root/scripts/rm.sh
[root@rocky8 scripts]# rm fstab
/root/scripts/fstab:/tmp/2022-07-18-20:08:48
[root@rocky8 scripts]# ll /tmp/2022-07-18-20\:08\:48/
total 4
-rw-r--r-- 1 root root 615 Jul 18 20:08 fstab
6、编写脚本huishouzhan.sh 运行该脚本,会显示当天所有被删除的文件名清单
[root@rocky8 scripts]# cat huishouzhan.sh
#!/bin/bash
. /etc/profile.d/color.sh
read -p "请输入要查找的日期:" day
cat /root/scripts/path.log | grep "$day" || echo -e "${RED}未找到记录${END}"
[root@rocky8 scripts]# ./huishouzhan.sh
请输入要查找的日期:2022
/root/scripts/passwd--/tmp/2022-07-18-19:53:24
[root@rocky8 scripts]# ./huishouzhan.sh
请输入要查找的日期:2020
未找到记录
7、编写脚本huanyuan,实现在脚本后通过指定参数,即可从回收站还原到原始路径。huanyun 文件名
[root@rocky8 scripts]# cat huanyuan.sh
#!/bin/bash
. /etc/profile.d/color.sh
read -p "请输入要还原的文件: " file
yuan=`cat /root/scripts/path.log|grep "$file"|cut -d: -f2,3,4`/$file
des=`cat /root/scripts/path.log|grep "$file"|cut -d: -f1|sed -rn 's#(.*)/[^/]+$#\1#p'`
cp $yuan $des && echo -e "${GREEN}已还原到原目录${END}" || echo -e "${RED}失败${END}"
[root@rocky8 scripts]# rm fstab
/root/scripts/fstab:/tmp/2022-07-18-20:42:47
[root@rocky8 scripts]# ./huanyuan.sh
请输入要还原的文件: fstab
已还原到原目录
[root@rocky8 scripts]# ls
backup.sh fstab huishouzhan.sh path.log systeminfo.sh
disk.sh huanyuan.sh links.sh rm.sh
8、编写脚本 argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数
[root@rocky8 scripts]# cat argsnum.sh
#!/bin/bash
[ $# -lt 1 ] && { echo "至少应该给一个参数";exit; } || egrep '^[[:space:]]*$' $1 |wc -l
[root@rocky8 scripts]# ./argsnum.sh /etc/fstab
1
[root@rocky8 scripts]# ./argsnum.sh
至少应该给一个参数
9、编写脚本 hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”
[root@rocky8 scripts]# cat hostping.sh
#!/bin/bash
. /etc/profile.d/color.sh
ping -c1 -W1 $1 &> /dev/null && echo -e "${GREEN}该IP地址可访问${END}" || echo -e "${RED}该IP地址不可访问${END}"
[root@rocky8 scripts]# ./hostping.sh 10.0.0.152
该IP地址可访问
[root@rocky8 scripts]# ./hostping.sh 10.0.0.153
该IP地址不可访问
10、编写脚本 checkdisk.sh,检查磁盘分区空间和inode使用率,如果超过80%,就发广播警告空间将满
[root@rocky8 scripts]# cat checkdisk.sh
#!/bin/bash
DiskUsed=$(df |sed -rn 's#^/dev/sd.* ([0-9]{1,3})%.*#\1#p'|sort -rn|head -1)
DiskInodeUsed=$(df -i |sed -rn 's#^/dev/sd.* ([0-9]{1,3})%.*#\1#p'|sort -rn|head -1)
if [ $DiskUsed -ge 20 -o $DiskInodeUsed -ge 80 ];then
wall "磁盘空间或inode使用率快要用尽,磁盘使用率:${DiskUsed} Inode使用率:${DiskInodeUsed} " | mail -s "警告:磁盘快用用尽" magedu@163.com
fi
11、编写脚本 per.sh,判断当前用户对指定参数文件,是否不可读并且不可写
[magedu@rocky8 tmp]$ cat per.sh
#!/bin/bash
[ ! -r $1 -a ! -w $1 ] && echo "文件不可读不可写" || echo "不满足"
[magedu@rocky8 tmp]$ ./per.sh fstab
文件不可读不可写
[magedu@rocky8 tmp]$ ll
total 8
drwxr-xr-x 2 root root 19 Jul 18 20:42 2022-07-18-20:42:47
-rw-r----- 1 root root 615 Jul 18 20:42 fstab
[magedu@rocky8 tmp]$ ll
total 8
drwxr-xr-x 2 root root 19 Jul 18 20:42 2022-07-18-20:42:47
-rw-r--r-- 1 root root 615 Jul 18 21:49 fstab
[magedu@rocky8 tmp]$ ./per.sh fstab
不满足
12、编写脚本 excute.sh ,判断参数文件是否为sh后缀的普通文件,如果是,添加所有人可执行权限,否则提示用户非脚本文件
[root@rocky8 scripts]# cat excute.sh
#!/bin/bash
[[ $1 =~ .*\.sh ]] && chmod +x $1 || echo "非脚本文件"
[root@rocky8 scripts]# ./excute.sh 1.sh
[root@rocky8 scripts]# ll 1.sh
-rwxr-xr-x 1 root root 0 Jul 18 21:55 1.sh
[root@rocky8 scripts]# ./excute.sh 2.txt
非脚本文件
13、编写脚本 nologin.sh和 login.sh,实现禁止和允许普通用户登录系统
#!/bin/bash
. /etc/profile.d/color.sh
read -p "请输入要禁止登陆的用户:" user
sed -i "/^$user/s#/bin/bash#/sbin/nologin#" /etc/passwd && echo -e "${RED}用户已经禁止登陆${END}" ## 也可以用usermod -s更改
[root@rocky8 scripts]# ./nologin.sh
请输入要禁止登陆的用户:magedu
用户已经禁止登陆
[root@rocky8 scripts]# cat login.sh
#!/bin/bash
. /etc/profile.d/color.sh
read -p "请输入您要允许登陆的用户:" user
sed -i "/^${user}\>/s#/sbin/nologin#/bin/bash#" /etc/passwd && echo -e "${GREEN}用户已经可以登陆${END}"
[root@rocky8 scripts]# ./login.sh
请输入您要允许登陆的用户:magedu
用户已经可以登陆
14、编写脚本testip.sh,要求如下
执行脚本会询问用户 ”请输入要测试的主机IP地址“ ,此时,如果输入的IP地址不合法,如大于255,直接提示,IP不合法,并退出脚本,如IP合法,判断所输入的主机是否在维护清单/root/weihu.txt中(该文本手动编写,格式如下)
192.168.0.1
192.168.0.200
……
如用户所输入主机在该清单中,则直接提示,该主机正在维护,然后退出脚本
如不在维护,开始判断是否通。如通。提示该主机正在运行,不通提示该主机已关机。
[root@rocky8 scripts]# cat testip.sh
#!/bin/bash
. /etc/profile.d/color.sh
read -p "请输入要测试的主机IP地址:" IP
if [[ ! $IP =~ ^(([1-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5]|0)\.){3}([1-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5]|0)$ ]] ;then
echo -e "${RED}请输入正确的IP地址${END}"
exit 1
elif grep $IP /root/scripts/weihu.txt &> /dev/null ;then
echo -e "${RAN}该主机正在维护${END}"
exit 2
elif ping -c1 -w1 $IP &> /dev/null ;then
echo -e "${GREEN}该主机正在运行${EMD}"
else
echo -e "${RED}该主机已关机${END}"
fi
[root@rocky8 scripts]# ./testip.sh
请输入要测试的主机IP地址:10.0.0.999
请输入正确的IP地址
[root@rocky8 scripts]# ./testip.sh
请输入要测试的主机IP地址:10.0.0.152
该主机正在运行
[root@rocky8 scripts]# ./testip.sh
请输入要测试的主机IP地址:192.168.0.3
该主机正在维护
15.BMI=体重(以千克为单位)除以身高的平方(以米为单位)。
例如:一个人的身高为1.75米,体重为68千克,他的BMI=68/(1.75*1.75)=22.2。
中国成人正常的BMI应在18.5-23.9之间,如果小于18.5为体重不足,如果大于等于24为超重,大于等于28为肥胖。
#!/bin/bash
. /etc/profile.d/color.sh
read -p "请输入您的身高(单位/m):" Height
read -p "请输入您的体重(单位/Kg):" Weight
if [[ ! $Height =~ ^[1,2]\.[0-9]{,2}?$ ]];then
echo -e "${REN}请输入正确的身高,单位米!${END}"
exit 2
fi
if [[ ! $Weight =~ ^[0-9]{1,3}$ ]];then
echo -e "${RED}请输入正确的体重,单位公斤!${END}"
exit 3
fi
BMI=$(echo $Weight/$Height^2 |bc)
if [ $BMI -lt 18 ];then
echo -e "${RAD}买点人参枸杞大补丸补补吧!${END}"
elif [ $BMI -eq 24 ];then
echo -e "${RAN}单身狗身体棒!${END}"
elif [ $BMI -lt 28 ];then
echo -e "${RAN}都是啤酒惹的祸!${END}"
else
echo -e "${RAN}腾哥的脂肪险多买点,你这一身都是钱~!${END}"
fi
[root@rocky8 scripts]# ./bmi.sh
请输入您的身高(单位/m):1.8
请输入您的体重(单位/Kg):80
都是啤酒惹的祸!