• 11、综合应用案例



    尚硅谷2022版Linux扩展篇Shell教程-讲师:武晟然

    壁立千仞 无欲则刚

    11、综合应用案例

    11.1 归档文件

    实际生产应用中,往往需要对重要数据进行归档备份。

    需求:实现一个每天对指定目录归档备份的脚本,输入一个目录名称(末尾不带/),将目录下所有文件按天归档保存,并将归档日期附加在归档文件名上,放在/root/archive 下。

    这里用到了归档命令:tar

    后面可以加上-c 选项表示归档,加上-z 选项表示同时进行压缩,得到的文件后缀名为.tar.gz。

    脚本实现如下:

    [root@centos7-101 scripts]# touch daily_archive.sh
    [root@centos7-101 scripts]# vim daily_archive.sh 
    #!/bin/bash
    # 搜先判断输入参数个数是否为1
    if [ $# -ne 1 ]
    then
    	echo "参数个数错误!应该输入一个参数,作为归档目录名"
    	exit
    fi
    
    # 从参数中获取目录名称
    if [ -d $1 ]
    then
    	echo
    else
    	echo
    	echo "目录不存在"
    	echo
    	exit
    fi
    DIR_NAME=$(basename $1)
    DIR_PATH=$(cd $(dirname $1); pwd)
    
    # 获取当前日期
    DATE=$(date +%y%m%d)
    
    # 定义生成的归档文件名称
    FILE=archive_${DIR_NAME}_${DATE}.tar.gz
    DEST=/root/archive/$FILE
    
    # 开始归档文件目录
    
    echo "开始归档文件目录..."
    
    # 没有文件夹就创建文件夹
    if [ ! -d /root/archive  ]
    then
    	mkdir /root/archive
    fi
    
    tar -czf $DEST $DIR_PATH/$DIR_NAME
    
    if [ $? -eq 0 ]
    then 
    	echo
    	echo "归档成功"
    	echo "归档文件为:$DEST"
    else
    	echo "归档出现问题"
    fi
    exit
    
    
    [root@centos7-101 scripts]# chmod u+x daily_archive.sh 
    [root@centos7-101 scripts]# ./daily_archive.sh /root/scripts
    
    开始归档文件目录...
    tar: 从成员名中删除开头的“/”
    
    归档成功
    归档文件为:/root/archive/archive_scripts_221201.tar.gz
    
    • 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
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    注意:

    使用tar命令打包时,如果打包目标是绝对路径会出现警告tar: 从成员名中删除开头的“/”

    根本原因是tar打包时会把目录结构打进去,解包时也会把对应的目录结构解出来

    11.2 发送消息

    我们可以利用 Linux 自带的 mesg 和 write 工具,向其它用户发送消息。

    # mesg:确认用户有没有打开发送消息功能 n关闭 y开启
    [root@centos7-101 ~]# mesg 
    is y
    # who:查看当前登录的所有用户 -T:查看当前所有登录用户是否打开消息功能
    [root@centos7-101 ~]# who -T
    qiqi     + pts/0        2022-12-02 22:07 (192.168.0.110)
    root     + pts/1        2022-12-02 09:59 (192.168.0.110)
    # write 接受用户 接受用户的控制台:向其他用户发送消息
    [root@centos7-101 ~]# write qiqi pts/0
    hello
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    需求:实现一个向某个用户快速发送消息的脚本,输入用户名作为第一个参数,后面直接跟要发送的消息。脚本需要检测用户是否登录在系统中、是否打开消息功能,以及当前发送消息是否为空。

    脚本实现如下:

    [root@centos7-101 scripts]# touch send_msg.sh
    [root@centos7-101 scripts]# vim send_msg.sh 
    #!/bin/bash
    
    # 查看用户是否登录
    # grep -i:忽略大小写 -m 数字:只要第一行数据
    
    # 拿出用户的名字
    login_user=$(who | grep -i -m 1 $1 | awk '{print $1}')
    # 判断用户名字是否为空 -z:值是否为空
    if [ -z $login_user ]
    then
    	echo "$1 不在线"
    	echo "退出脚本"
    	exit
    fi	
    
    # 截取who中+或-
    is_allowed=$(who -T | grep -i -m 1 $1 | awk '{print $2}')
    # 查看用户是否开启消息功能
    if [ $is_allowed != "+" ]
    then
    	echo "$1 没有开启消息功能"
    	echo "退出脚本"
    	exit
    fi	
    
    
    # 发送消息不为空
    if [  -z $2 ]
    then
    	echo "发送消息为空"
    	echo "脚本退出"
    	exit
    fi
    
    # 取出发送消息
    whole_msg=$(echo $* | cut -d " " -f 2-)
    
    # 获取用户登录终端
    user_terminal=$(who | grep -i -m 1 $1 | awk '{print $2}')
    
    # 发送消息
    echo $whole_msg | write $login_user $user_terminal
    
    # 退出
    exit
    
    [root@centos7-101 scripts]# chmod u+x send_msg.sh 
    [root@centos7-101 scripts]# ./send_msg.sh qiqi hello
    发送成功
    [root@centos7-101 scripts]# ./send_msg.sh qiqi say
    发送成功
    
    • 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
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    qiqi端

    Message from root@centos7-101 on pts/1 at 22:58 ...
    hello
    EOF
    
    Message from root@centos7-101 on pts/1 at 22:59 ...
    say
    EOF
    [qiqi@centos7-101 ~]$
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    Ubuntu服务器安全性提升:修改SSH默认端口号
    英语六级-day4
    十年架构师:读懂这篇微服务实战笔记,金九银十薪资直接翻倍
    .NET LoongArch64 正式合并进入.NET
    # 技术栈知识点巩固——消息队列
    学周刊杂志学周刊杂志社学周刊编辑部2022年第24期目录
    Spring基于XML实现事务管理
    Python 算法高级篇:递归与迭代的比较与应用
    C++类型转换运算符的重载,自增自减运算符的重载
    《最新出炉》系列入门篇-Python+Playwright自动化测试-43-分页测试
  • 原文地址:https://blog.csdn.net/zhao854116434/article/details/128125609