利用shell监控云服务器文件夹变化

简介

这个代码的主要功能是对一台linux服务器(我使用的为centos7版本)的某个文件夹进行监控,当这个文件夹发生变化时(比如有对文件的增,删,改操作),那么就会记录到相应的日志文件中,然后根据日志文件来对本地机器的某个文件夹进行同步(也可以理解为当服务器的文件夹发生变化后本地的文件夹也同步那个变化)

使用方式

根据压缩包里面的使用文档来操作即可

源代码和使用文档

链接:https://pan.baidu.com/s/1WVa6JosvroZLld4l2WvHKQ?pwd=zt34
提取码:zt34

一. 环境配置

  1. 为了实现监控文件夹变化,我采用的工具为inotifywait,这个工具的具体使用可以自行百度,然后要配置环境来运行代码,这里我也用了一个脚本environment.sh来实现一键配置环境。
  2. 配置环境主要有三个包分别为expect和inotify-tools包,如果代码不行的话你们可以找其他资料来配置,只要能装上这两个包后面的使用应该就不成问题。
  3. 注意:在安装inotify-tools时我这里的代码涉及到了换源操作来保证成功率,如果你不想换源的话可以注释掉下面的代码。
#!/bin/bashif [ -z "$(rpm -qa | grep expect)" ]
thenecho "此处写入下载expect的命令";yum -y install tclyum -y install expect # 未安装成功的话请自行更换源if [ -z "$(rpm -qa | grep expect)" ]thenecho "安装失败,请自行更换源重新安装expect!"elseecho "expect包安装成功!"fi
elseecho "expect包已安装!";
fiif [ -z "$(rpm -qa | grep inotify-tools)" ]
thenecho "开始下载inotify-tools";# 下面的代码涉及到了换源操作,不想换可以注释下面4行代码mv -f /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bakwget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repoyum clean allyum makecache# 分割线---------/usr/bin/expect <<EOFset timeout -1spawn yum install epel-release expect {"*y/d/N*" { send "y\r"; exp_continue}}expect eof
EOF# yum search inotify-tools# yum info inotify-tools/usr/bin/expect <<EOFset timeout -1spawn yum install inotify-tools expect {"*ok*" { send "y\r"; exp_continue}"*y/N*" { send "y\r"; }}expect eof
EOF# 未安装成功的话请自行更换源if [ -z "$(rpm -qa | grep inotify-tools)" ]   thenecho "安装失败,请自行更换源重新安装inotify-tools!"elseecho "inotify-tools包安装成功!"fi    elseecho "inotify-tools包已安装!";
fi

二. 监控信息配置

  1. 为了配置好监控信息,所以我写了monitor.sh这个脚本,主要是配置监控信息,注意这份代码里的第二行要保持为空行,因为后面会写入信息到里面
  2. pwdpath主要是你需要监控的目录,我这里选择了为/mnt目录下的所有文件
  3. logpath是放监控日志的地方,当你要换监控目录时建议只修改pwdpath即可,因为后面的代码拷贝文件时的固定目录为logpath
  4. create,moved_to,moved_from,move,attrib,modify,delete这些主要代表对文件夹内的移动,新建,,元数据修改,内容修改等操作进行监控
#!/bin/bash#第二行为写入的监控目录信息#监控本机目录文件的改变,并写入log文件。pwdpath='/mnt'
logpath=$pwdpath'/monitor.log'  #监控日志文件放在当前目录下#只对监控目录中的移动、新建、删除事件进行记录
#对目录中移动,新建,,元数据修改,内容修改,进行监控,然后将数据输入log中
$(inotifywait -mrq -e 'create,moved_to,moved_from,move,attrib,modify,delete' $inopath >> $logpath)

三.主程序思路分析

  1. 这里的主程序为test.sh,代码的思路分析如下:
  2. 首先是配置好监控信息,这里用户自己输入即可
#!/bin/bash# 要传监控脚本和expect脚本才能安装监控脚本所需!# 你要把文件下载到那个目录?
localPath='/tmp/'
# root密码和ip
password=123456
ip=192.168.1.30
# 监控目录
ads=/mnt/share/# 把上面的信息填入你需要的即可开始运行测试
#------------------------------------------------------------------
  1. 然后把监控目录传到monitor.sh文件中的第二行内
# 把监控目录传入monitor.sh中
sed -i 2iinopath="'$ads'" monitor.sh
  1. 检查本机环境配置是否正确
# 检查本机是否安装expect脚本
if [ -z "$(rpm -qa | grep expect)" ]
thenecho "开始下载expect脚本";yum -y install tclyum -y install expect # 未安装成功的话请自行更换源if [ -z "$(rpm -qa | grep expect)" ]thenecho "安装失败,请自行更换源重新安装expect!"elseecho "expect包安装成功!"fi
elseecho "expect包已安装!";
fi# 检查本机是否安装好sshpass服务
if [ -z "$(rpm -qa | grep sshpass)" ]
thenecho "开始下载sshpass";yum -y install sshpass# 未安装成功的话请自行更换源if [ -z "$(rpm -qa | grep sshpass)" ]thenecho "安装失败,请自行更换源重新安装sshpass!"elseecho "sshpass包安装成功!"fi    elseecho "sshpass包已安装!";
fi
  1. 把监控脚本利用scp命令传到云服务器上,然后运行监控脚本(这里注意有可能会运行失败,因为这里是ssh上你的云服务器,可能出现权限不够导致无法运行监控脚本,如果失败的话把monitor.sh复制到云服务器上运行即可)
# 用scp传入监控脚本到/mnt下
/usr/bin/expect <<EOFset timeout -1spawn scp -r monitor.sh root@$ip:/mnt/expect {"*yes/no" { send "yes\r"; exp_continue}"*password:" {send "$password\r"}}expect eof
EOF
echo "已传送监控脚本到云服务器"# 运行服务器上的监控脚本
sshpass -p $password ssh root@$ip << eeooff
sh /mnt/monitor.sh>&out.txt &
# 退出ssh
exit
eeooff
echo "已在服务器上运行监控脚本"
  1. 运行完监控脚本后删除之前写入第二行的内容,避免下次写入失败
# 删除monitor.sh上的监控目录信息,避免下次使用时会写入错误信息
sed -i '2d' monitor.sh
  1. 用一个while来保证程序持续运行
  2. 把云服务器上的监控日志monitor.log复制到/tmp/下并清除其内容,可以理解为这是一个剪切的操作。
  3. 把监控日志复制到本地机器上
  4. 对监控日志进行分析,获取操作信息和文件名,分类后存入a.log和b.log中,然后再根据这两个文件进行删除和下载操作以实现同步。
#------------------------------------以下均用while循环使得程序持续进行
while :
do# 将monitor.log复制到/tmp下,然后清除日志内容
sshpass -p $password ssh root@$ip > /dev/null 2>&1 << eeooff
# 删除/tmp内原日志
rm -rf /tmp/monitor.log
# 剪切日志
cp /mnt/monitor.log /tmp/monitor.log
cat /dev/null > /mnt/monitor.log
exit
eeooff
echo "已剪切monitor.log文件"# 复制monitor.log文件到本地
/usr/bin/expect  > /dev/null 2>&1<<EOFset timeout -1spawn scp -r root@$ip:/tmp/monitor.log /expect {"*yes/no" { send "yes\r"; exp_continue}"*password:" {send "$password\r"}}expect eof
EOF
echo "已获取到monitor.log文件"#-------------------------------------------
#将关于删除的日志信息输出到c.log中
cat /monitor.log | grep DELETE >> /c.log# 将关于删除信息的日志文件去重按序放入b.log
cut -d " " -f 3 /c.log | sort -u >> b.log;# 将增改信息的日志文件去重按序放入a.log
cut -d " " -f 3 /monitor.log | sort -u >> a.log;# 计算文件内的行数,用于循环变量大小的设置
I=$(grep -c "" a.log);
J=$(grep -c "" b.log);
# echo "本次共获取到${I}个新文件";#----------------------------------------------与服务器同步删除操作(先检查删除再检查下载,防止文件被遗漏)------------------------
echo ""
echo ""
echo "开始删除操作"
echo ""
echo ""for (( j=1;j<=$J;j=$[$j+1] ))
do#每次最多获取5个文件,因为无法用for循环创建变量名(因为变量名的命名不能为变量)F=$(sed -n ${j}p b.log);if [ ! -n "$F" ]; then F=0fi j=$[$j+1];G=$(sed -n ${j}p b.log);if [ ! -n "$G" ]; then G=0fi j=$[$j+1];H=$(sed -n ${j}p b.log);if [ ! -n "$H" ]; then H=0fi j=$[$j+1];K=$(sed -n ${j}p b.log);if [ ! -n "$K" ]; then K=0fi j=$[$j+1];L=$(sed -n ${j}p b.log);   if [ ! -n "$L" ]; then L=0fi  # 开始根据信息删除本地的文件SUM2=$F" "$G" "$H" "$K" "$Lcd /tmp/rm -rf $SUM2;cd -done#---------------------------------------------------下载文件操作------------
# 逐行获取数据放入变量(考虑使用for循环)
for (( i=1;i<=$I;i=$[$i+1] ))
do#变量后面如果要加东西做参数的话用中括号#每次最多获取5个文件,因为无法用for循环创建变量名(因为变量名的命名不能为变量)A=$(sed -n ${i}p a.log);if [ ! -n "$A" ]; then A=0fi i=$[$i+1];B=$(sed -n ${i}p a.log);if [ ! -n "$B" ]; then B=0fi i=$[$i+1];C=$(sed -n ${i}p a.log);if [ ! -n "$C" ]; then C=0fi i=$[$i+1];D=$(sed -n ${i}p a.log);if [ ! -n "$D" ]; then D=0fi i=$[$i+1];E=$(sed -n ${i}p a.log);   if [ ! -n "$E" ]; then E=0fi  # 开始下载文件,下载的目录为当前目录SUM=$A","$B","$C","$D","$E# 复制文件到本地/usr/bin/expect <<EOFset timeout -1spawn scp -r root@$ip:$ads\{$SUM\} $localPathexpect {"*yes/no" { send "yes\r"; exp_continue}"*password:" {send "$password\r"}}expect eof
EOFdone# 利用重定向清除文件内内容(此时已下载完所有文件)
cat /dev/null > a.log
cat /dev/null > b.log
cat /dev/null > /c.logecho "本次共检查到${I}个新文件,已下载到${localPath}"
echo "本次共检查到${J}个文件被删除,已从${localPath}中删除相同的文件"
echo "本次搜寻已完成,30s后再次寻找"
echo ""
echo ""
echo ""
echo ""
echo ""#while循环中每30秒执行一次
sleep 30
done

四. 将脚本做成服务形式

  1. 具体的方式可以去看使用文档里写的
  2. 这里我没怎么写注释我也忘了代码是什么意思,可以百度一下"将shell脚本做成service形式"来看看,应该不难理解
  3. 这个服务主要是将test.sh做成开机自启,后台运行的形式
  4. 写成服务形式后就可以挂在后台自动实现两个文件夹同步了,而且只要监控程序monitor.sh一直在服务器上运行就能实现同步功能
[Unit]
Description=test
After=default.target[Service]
Type=forking    # 表示后台运行模式
ExecStart=/root/test/test.sh    #启动服务时执行的命令[Install]
WantedBy=default.target

利用shell监控云服务器文件夹变化相关推荐

  1. 服务器永久免费文件夹加密,云服务器文件夹加密

    云服务器文件夹加密 内容精选 换一换 登录Windows操作系统的弹性云服务器时,需使用密码方式登录.因此,用户需先根据创建弹性云服务器时使用的密钥文件,获取该弹性云服务器初始安装时系统生成的管理员密 ...

  2. 手机管理服务器文件夹,手机查看云服务器文件夹

    手机查看云服务器文件夹 内容精选 换一换 通过调用云手机服务提供的接口,您可以完整地使用云手机的所有功能.例如查询云手机列表.重启云手机.为云手机推送文件. 区块链服务状态为"异常" ...

  3. 手机连接服务器传文件夹,手机连接云服务器文件夹

    手机连接云服务器文件夹 内容精选 换一换 本节操作介绍本地MacOS系统主机通过安装"Microsoft Remote Desktop for Mac"工具向Windows云服务器 ...

  4. 手机连接服务器传文件夹,手机连接云服务器文件夹吗

    手机连接云服务器文件夹吗 内容精选 换一换 本节操作介绍本地MacOS系统主机通过安装"Microsoft Remote Desktop for Mac"工具向Windows云服务 ...

  5. 服务器文件变更监控,监控文件夹变化并ftp到服务器

    监控文件夹变化并ftp到服务器 内容精选 换一换 Loader是在开源Sqoop组件的基础上进行了一些扩展,除了包含Sqoop开源组件本身已有的功能外,还开发了如下的增强特性:提供数据转化功能支持图形 ...

  6. 手机服务器在那个文件夹,手机连接云服务器文件在哪个文件夹

    手机连接云服务器文件在哪个文件夹 内容精选 换一换 本节为您介绍如何在本机使用远程登录工具MSTSC登录Windows弹性云服务器.弹性云服务器状态为"运行中".如果弹性云服务器采 ...

  7. C# ASP.NET MVC 图片上传的多种方式(存储至服务器文件夹,阿里云oss)

    图片上传时我们进场用到的一个功能今天将他整理了一下写了个demo希望对大家有用 该demo分为如下 1.上传至至服务器文件夹 2.上传至阿里云oss 3.百度webupload上传图片 效果图如下: ...

  8. 华为云服务器 共享文件夹在哪个文件夹,用户数据安全存储 华为云空间这些功能大显身手...

    在我们日常使用智能机时,数据储存功能极为重要.许多华为手机用户都将个人数据保存在手机本地储存中,却忽视了华为手机自带的云空间这一项功能.华为手机中的云空间看似不起眼,实则大有乾坤,它不仅能帮我们在生活 ...

  9. win7系统ftp服务器共享文件夹权限,win7 ftp服务器 文件夹权限

    win7 ftp服务器 文件夹权限 内容精选 换一换 本课程主要针对openEuler操作系统工程师在基础运维工作,以文件共享服务器的搭建和运维为案例,讲解openEuler操作系统的基础知识,并培养 ...

最新文章

  1. elementui图片上传php,vue+Element Ui 实现自动上传图片
  2. Nginx server_name通配符匹配配置
  3. java中的getfirst_Java LinkedList getFirst()用法及代码示例
  4. Java并发编程实战~Happens-Before 规则
  5. 阶段3 1.Mybatis_03.自定义Mybatis框架_1.自定义Mybatis的分析-执行查询所有分析
  6. 计算机操作系统张尧学第四章课后答案,计算机操作系统 课后习题答案 张尧学...
  7. WFDB工具箱在Matlab2010b及更高版本上的安装
  8. 什么叫误差的反向传播,反向传播误差怎么算的
  9. DOSbox汇编集成环境下的详细设置
  10. stm32万年历流程图_基于 STM32 RTC的万年历
  11. 解决高德地图闪屏黑屏
  12. 爬虫-1-基础和urllib
  13. 白牌交换机有哪些特点?和传统交换机比有什么特别?—Vecloud
  14. 软件授权License的区别
  15. linux 磁盘碎片整理
  16. Paint the Roads UVALive - 2197
  17. 主成分分析 (PCA) 和独立成分分析 (ICA)附Matlab代码
  18. SSM+ckplayer.js实现web项目网页看视频
  19. 一只伤痕累累但不断前行且不服输的蜗牛---疯狂的一个半月
  20. [附源码]java毕业设计水果商城

热门文章

  1. 苹果电脑安装Windows系统完整教程,新手快速解决装系统问题
  2. 高能揭秘:互联网大厂的数据治理与资产管理实战 | DAMS 2020
  3. 资料打印不用再跑文印店,网上打印省时省力
  4. Android护眼功能,双非本科字节跳动Android面试题分享
  5. spring源码解读-第二部分面想切面编程
  6. C++同步机制之条件变量(std::condition_variable)
  7. 微信检测域名防封系统 如何调用微信官方的微信域名检测接口API
  8. 广东计算机类专科院校排名,广东省高职院校全国排名+各院校王牌专业
  9. 获取钉钉花名册接口和枚举类
  10. 由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)...