shell案例

1、案例1

  • /opt/useradd.sh,要求提示用户输入用户名,输入的用户名zhangsan存在的话,提示user is exist,不存在的话,user not exist ,创建zhangsan用户,并且创建一个/opt/zhangsan目录,修改权限666,如果输入的不是zhangsan,则输出please input right username,并且退出脚本
read -p "input user zhangsan " get_user
if [[ "$get_user" != "zhangsan" ]];then
        echo "please input right username"
        exit 100
fi
if id $get_user &> /dev/null;then
        echo "user is exist"
else
        echo "user not exist"
        useradd $get_user
        dir_path="/opt/$get_user"
        if [ ! -d $dir_path ];then  # 目录不存在,这个表达式取反就是为真,执行代码块,目录存在这个,返回的结果为假,不执行代码块,解决了这个目录是否存在的问题
                mkdir /opt/zhangsan
        fi
        chmod 666 /opt/zhangsan
fi

  • 编写一个/opt/service_status,用于管理vsftpd服务的状态

    • start,如果已经启动了输出vsftpd is active,否则启动,vsftp start

    • stop,停止了,输出vsftpd is inactive,否则 vsftp stop

    • restart,输出vsftpd

    • exist,退出脚本,只有输入exist才能退出脚本


# 首先使用 [[ ]] 这个条件测试的语句,这个的话,就需要比较,

# 如果直接使用命令的话,也就是 &> 正确和错误的输出都会接收,然后有一个返回值为真或者假
[root@master opt]# cat service_status.sh 
while true
do
        read -p "intput stats:|start|stop|restart|exit " get_status
	case $get_status in
		start)
			if systemctl is-active vsftpd &> /dev/null;then
				echo "vsftpd is active"
			else
				systemctl start vsftpd
			fi
				;;
		stop)
			if ! systemctl is-active vsftpd &> /dev/null;then
				echo "vsftpd is inactive"
			else
				systemctl stop vsftpd
			fi
				;;
		restart)
			if systemctl restart vsftpd;then
				echo "vsftpd restart"
			fi
				;;
		exit)
			break
			;;
		*)
			echo "输入正确的"
			;;
	esac
	
done

  • /opt/file_status.sh ,提示用户输入文件的路径/tmp/tmpfile,不存在的话输出file is not exist,并且退出脚本,如果文件存在的话,继续下面操作

    • 判断文件是否存在redhat,出现了话,修改bob用户的描述信息为mysql

    • 不存在的话,输出redhat not exist

[root@master opt]# cat file_status.sh 
read -p "input /tmp/tmpfile: " get_file
if [ ! -f $get_file ];then
       echo "file not exist"
       exit 100
else
	if grep redhat  "$get_file" &> /dev/null;then
		usermod -c "mysql" bob
	else
		echo "redhat not exist"
	fi
fi

2、网络检查脚本

3、查看指定服务是否运行

  • 需求就是输入服务,如果已经启动了,就不需要了

  • 如果就是服务没有启动的话,就会启动了

  • $1 参数用来控制

[root@master shell]# cat 10.sh 
echo "请输入一个服务:"

if [ ! $# -eq 1 ];then
	echo "没有输入参数error"
	exit 100
fi

if systemctl is-active --quiet $1;then
	echo "$1 is active"
else
	systemctl start $1
	echo "### vsftpd start ###"
fi

4、用户登录脚本

[root@master shell]# cat 11.sh 
echo "欢迎回来: $(whoami)"
echo "当前时间: $(date)"
echo "系统已运行: $(uptime -p)"
echo "登录用户:"
who

5、要求从一个文件 /opt/userlist.txt 中读取用户名(每行一个用户)。

  • 如果用户已存在,输出 "user already exists"。

  • 如果用户不存在,则创建用户,并在 /home/ 下生成对应目录,权限设为 700

[root@master opt]# cat user.sh 
for i in $(cat /opt/userlist.txt)
do
	if id $i &> /dev/null;then
		echo "$i already exists"
	else
		useradd $i && echo '123' | passwd --stdin $i &> /dev/null
		chmod 700 /home/$i
		echo "$i is create"
	fi
done

[root@master opt]# cat userlist.txt 
zhang
wang


# 或者使用while 也可以完成,避免了空格的问题,while可以处理每一行的内容,不会被空格影响


[root@master opt]# cat while.sh 
while read -r username;  # 读取这个变量,变量接收的是下面的userlist这个文件
do
	if id $username &> /dev/null;then
		echo "$username is exist"
	else
		useradd "$username"
		echo '123' | passwd --stdin "$username" &> /dev/null
		chmod 700 "/home/$username"
		echo "$username is create"
	fi
done < /opt/userlist.txt	


6、磁盘使用率报警

  • 编写脚本 /opt/disk_check.sh:

  • 检查根分区 / 的磁盘使用率。

  • 如果使用率大于 80%,则输出 "Disk usage high: xx%"。

  • 否则输出 "Disk usage normal: xx%"。

# awk 从第二行中第6列进行取出这个数字,然后sed去掉这个%

[root@master opt]# cat disk_check.sh 
useag=$(df -hT / | awk 'NR==2 {print $6}' |sed -s 's/%//')
if [[ "$useag" -gt 80 ]];then
	echo "disk useage high $useag"
else
	echo "disk useage normal $useag"
fi

7、判断文件类型并分类

  • 编写脚本 /opt/file_check.sh:

  • 要求用户输入一个路径。

  • 如果是目录,输出 "This is a directory"。

  • 如果是普通文件,输出 "This is a file"。

  • 如果不存在,输出 "No such file or directory"。

[root@master opt]# cat file_check.sh 
read -p "input lujin: " file_d
if [[ -f $file_d ]];then
	echo "$file_d is a file"
elif [[ -d $file_d ]];then
	echo "$file_d is a directory"
else
	echo "$file_d is not file or directory"
fi

8、备份日志并压缩

  • 写脚本 /opt/backup_log.sh

  • 把 /var/log/messages 文件备份到 /opt/backup/ 下,文件名格式:messages-YYYYMMDD.tar.gz

  • 如果 /opt/backup/ 目录不存在则自动创建。

  • 最后提示 "Backup success: 文件名"。

# 通常就是用变量来代替的话,非常的方便
[root@master opt]# cat backup_log.sh 
back_dir="/opt/backup"

if [[ ! -d $back_dir ]];then
	echo "目录不存在"
	mkdir $back_dir
fi
date_back=$(date "+%Y%m%d")

backup_file="message-$date_back.tar.gz"
back_path="$back_dir/$backup_file"

tar -czf "$back_path" /var/log/messages &> /dev/null
if [ $? -eq 0 ];then
	echo "backup success: $backup_file"
else
	echo "backup failed"
fi

9、检查端口是否开放

  • 输入一个端口号作为参数,例如 ./check_port.sh 22

  • 判断该端口是否在监听:

  • 是 → 输出 "Port 22 is open"

  • 否 → 输出 "Port 22 is closed"

# 通过检测:端口号检查
[root@master opt]# cat check_port.sh 
if [ ! $# -eq 1 ];then
	echo "请输出参数"
	exit 100
fi

port=$1
if netstat -pant| grep -q ":$port";then
	echo "Port $port is open"
else
	echo "Port $port is close"
fi

10、密码复杂度检测

  • 写脚本 /opt/check_passwd.sh

  • 提示用户输入一个密码(用 read -s 隐藏输入)。

  • 要求密码必须同时包含 大写字母、小写字母、数字,长度 ≥ 8。

  • 如果不符合规则,提示 "Weak password";符合则 "Strong password"。

[root@master opt]# cat check_passwd.sh 
read -s -p "请输入密码: " passwd
echo

if [ ${#passwd} -lt 8 ];then
	echo "Weak passwd"
	exit 1
fi
if ! [[ $passwd =~ [A-Z] ]];then
	echo "Weak passwd"
	exit 1
fi

if ! [[ $passwd =~ [a-z] ]];then
	echo "Weak passwd"
	exit 1
fi

if ! [[ $passwd =~ [0-9] ]];then
	echo "Weak passwd"
	exit 1
fi

echo "Strong passwd"
exit 0

11、定时清理临时文件

  • 写脚本 /opt/clean_tmp.sh

  • 删除 /tmp 下 7 天前的文件。

  • 每次删除前输出 "Deleting "。

[root@master opt]# cat clean_tmp.sh 
find /tmp -type f -mtime +7 -exec echo "Deletin {}" \; -exec rm -f {} \;
exit 0

posted @ 2025-09-06 21:51  w7nn  阅读(5)  评论(0)    收藏  举报