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