• Shell练习2


    9.19 写一个脚本,遍历/data/目录下的txt文件,将这些文件做一个备份,备份的文件名增加年月日后缀,比如aming.txt备份为aming.txt_20230919

    #!/bin/bash
    #author: cqy
    #version:v1
    #data:2023-09-19
    
    ## 定义后缀变量,注意下面这个``(反引号)的含义
    suffix=`date+%Y%m%d`
    
    ##找到/data/目录下的txt文件,用for循环遍历
    for f in `find /data/ -type f -name "*.txt"`
    do
    	echo "备份文件$f"
    	cp ${f} ${f}_${suffix}
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    知识点总结:
    1、date命令的用法,可以根据日期、时间获取到想要的字符
    2、for循环如何遍历文件

    9.20 创建10个用户,并给他们设置随即密码,密码记录到一个文件里,文件名userinfo.txt。用户从user_00到user_09,密码要求:包含大小字母以及数字,密码长度15位。

    #!/bin/bash
    #author:cqy
    #version:v1
    #date:2023-09-20
    
    ##先查看/tmp/userinfo.txt文件是否存在,存在的话先删除,以免影响到本次脚本执行结果。(密码文件,如果存在,在里面写东西,可能会造成冲突)
    if [ -f /tmp/userinfo.txt]
    then
    		rm -f /tmp/userinfo.txt
    fi
    ##判断mkpasswd命令在不在,我们用该命令生成随即字符串,也就是用户的密码。(判断随即命令在不再)
    if ! which mkpasswd
    then
    	##ub
    	apt install -y expect
    fi
    ##借助seq生成从00到09,10个数的队列
    for i in `seq -w 0 09`
    do
    	##每次生成一个随即字符串,将该字符串赋值给p变量,这个就是用户的密码
    	##mkpasswd命令默认生成的字符串会包含大小写字母和数字和特殊符号
    	##如果不要求特殊符号,可以加-s 0来限定不使用特殊符号
    	p=`mkpaswd -l 15 -s 0`
    	##添加用户,并给该用户设置密码
    	useradd user_${i} && echo "${p}" | passwd --stdin user_${i}
    	echo "user_${i} ${p}" >> /tmp/userinfo.txt
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    关键知识点总结:
    1、mkpasswd可以生成随即字符串,-l指定长度,-s指定特殊字符串个数,-c指定小写字母个数 -C指定大写字母个数,-d指定数字个数
    2、seq可以生成序列,用法: seq 1 5; seq 5; seq 1 2 10;seq 10 -2 1; seq -w 1 10;
    3、passwd – stdin username

    9.21 用来检测本机所有磁盘分区读写是否正常

    提示:可以遍历所有挂载点,然后新建一个测试文件;然后在删除测试文件,如果可以正常新建和删除,则说明该分区没有问题

    #!/bin/bash
    #author:cqy
    #version:v1
    
    for mount_p in `df | sed '1d' | grep -v  'tmpfs' | awk '{print $NF}'`
    do
    	## 创建测试文件,并删除,从而确定该磁盘分区是否有问题
    	touch $mount_p/testfile && rm -f $mount_p/testfile
    	if [$? -ne 0]
    	then
    		echo "$mount_p 读写有问题"
    	else
    		echo "mount_p 读写正常"
    	fi
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    关键知识点总结:
    1、&& 连接符表示当前的命令执行成功才会执行后面的命令
    在本例子中,只有两条命令都执行成功了,返回值才是0,否则任何一条命令执行出错,返回之都是非0
    2、写脚本的过程中,可以一边在命令行中运行命令测试一边写脚本
    3、shell脚本里sed、grep、awk无处不在,所以用号这三个工具也是关键。
    磁盘分区正常或者不正常有什么影响?

    9.24 检查/data/wwroot/app目录下所有文件和目录,看是否满足下面条件

    1、所有文件的权限为644
    2、所有的目录权限为755
    3、文件和目录所有者为www. 所属组root
    如果不满足,改成符合要求
    注意:不要直接改权限,一定要有判断的过程

    ##!/bin/bash
    ## author:cqy
    ## version:v1
    
    cd /data/wwroot/app
    ##遍历所有目录和文件,用"find ."即可
    for f in `find .`
    do
    	##查看文件权限
    	f_p=`stat -c  %a $f`
    	##查看文件所有者
    	f_u=`stat -c %U $f`
    	##查看文件所属组
    	f_p=`stat -c %G $f`
    
    	##判断是否为目录
    	if [ -d %f ]
    	then
    		[ $f_p != '755' ] && chmod 755 $f
    	else
    		[ $f_p != '644' ] && chmod 644 $f
    	fi
    
    	## && 用在两条命令中间,可以起到if判断的作用
    	## 当第一条命令成功,才会执行后面的命令
    	[ $f_u != 'www' ] && chown www $f
    	[ $f_g != 'root' ] && chown : root $f
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    关键知识点总结:
    1、查看文件权限:stat -c %a 1.txt
    2、查看文件所属组: stat -c %G 1.txt
    3、查看文件所有者: stat -c %U 1.txt
    && 可以实现:当前命令执行成功再执行后面命令
    || 可以实现,当前命令不成功再执行后面命令

  • 相关阅读:
    Java并发面试题:(六)悲观锁和乐观锁和Java内存模型和CAS原理
    edge浏览器 路径获得
    Flask框架:运用Ajax轮询动态绘图
    Spring 基础知识、执行流程、源码分析和设计思想
    Android setTheme设置透明主题无效
    自动化测试框架
    java 的jar打包方式(exe安装版,免安装版(zip包里有exe和jre),bat双击运行版本),运行在没有jre环境中
    vue框架,input相同标签如何定位-label定位
    Scrapy 爬虫教程:从原理到实战
    7月末出去玩啦,给大家分享一个青岛攻略吧~
  • 原文地址:https://blog.csdn.net/cai88453626/article/details/133049684