壁立千仞 无欲则刚
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
注意:
使用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
需求:实现一个向某个用户快速发送消息的脚本,输入用户名作为第一个参数,后面直接跟要发送的消息。脚本需要检测用户是否登录在系统中、是否打开消息功能,以及当前发送消息是否为空。
脚本实现如下:
[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
发送成功
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 ~]$