[稳定版本]Dsync——实时监视并改动远程目录程序
当前版本 | Stable 1.0 | 迭代 | N/A | 稳定版本 |
支援版本 | Linux | |||
使用语言 | Python | |||
当前大小 | 4.1K | |||
开发进度 |
100%
|
2016-12-8 |
Alpha | Beta | Stable |
A1 | B1 | v1.0 |
A1 |
1.完成对目录监视的功能 |
B1 |
1.重写Watchdog相关事件 2.使用pexpect创建rsync同步进程 3.增加配置文件,灵活设置监控与远程目录
|
V1.0 |
1.Windows平台上使用Cygwin测试 |
背景故事
谢总有个树莓派,后来谢总跟大D说,在树莓派上搞了个Nginx
,于是就有了个问题,能否在检测本地指定目录内文件的活动并自动更新到远程目录。
给谢总推荐过SVN
,也推荐过Git
,可能谢总觉得都不是很好用。
偶然有一天,大D知道了Python
有一个模块——Watchdog
,可以用来检测目录下文件的变化,正巧大D也有了类似的需求,那就写一个小工具吧。
开发目标
1.实现对目录的监视。
2.实现在目录内创建文件或文件夹后上传到指定远程目录内。
3.采用配置文件来实现控制被监测目录和远程目录位置。
4.自动化安装所需模块和依赖。
开发平台
Ubuntu 16.04 LTS
+Python 2.7
,理论兼容Linux
各大发行版。
并不打算实现对Windows
的兼容,Cygwin
能够兼容就可以了。
开发日志
2016-12-8
1.研究了若干天自动安装,还是不搞了,远比使用pip
来安装所需依赖麻烦。
2.切换到v1.0正式发布
2016-12-5
1.写好了配置文件功能,读取本地yml
配置文件配置远程主机名、登录名、密码、同步目录等选项。
2016-12-4
1.解决了pexpect
执行rsync
对远程目录同步创建文件时文件名中带空格无法创建的问题。
2.重写了watchdog
的创建、删除、修改、移动四个事件。
3.进一步优化代码,模块分离。
4.监控目录并同步远程目录的基本功能已经实现,转入Beta 1阶段,接下来的主要任务就是增加附加功能
2016-12-3
1.已实现对目录的监视,正在重写Watchdog
自带的几个事件。
2.利用pexpect
模块来多线程执行rsync
对远程目录进行同步,但现在遇到文件名如果包含空格导致无法执行的问题。
错误报告
暂无
源代码
源代码已托管在Github,请访问:https://github.com/derek-s/Dsync
也可以在本站直接下载:Dsync-master.zip
下载完成后建议校验文件:
大小: 2988 字节
修改时间: 2016年12月8日, 12:16:51
MD5: 2FE940BD8BBF393033304F4C91541BAF
SHA1: 0CDC39FA337B6518C231CA793329024AAAF7F24B
CRC32: 0A8C3F15
安装与使用
1.安装依赖
由于使用Python
开发,请确保有Python 2.7
环境和pip
,并请使用pip
安装所需要的库。
1 2 3 |
#需要安装 watchdog logging pyyaml pexpect 四个Python库 pip install watchdog logging pyyaml pexpect |
需要远程目标机上安装有rsync
1 |
sudo apt-get install rsync |
2.修改配置文件
下载源代码并解压,修改_config.yml
文件。
1 2 3 4 5 6 7 |
# Dsync Config host: 远程主机地址 user: 登录用户名 passwd: 登录密码 remotedir: 远程主机路径 localdir: 本地监控路径 |
例:
1 2 3 4 5 6 7 8 |
# Dsync Config host: 192.168.10.105 user: root passwd: 123456 remotedir: /home/wwwroot/ localdir: /home/derek/code/ |
注意
- 每一配置项的
:
后面需有一个空格
- 路径需要将最后一个
/
带上
3.使用
打开终端运行
1 2 |
python Dsync.py |
正常运行时会有Observer start
的提示。
4.备注
代码中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
def pexpectRun(cmd): #调用pexpect创建rsync子线程,带log输出到系统标准输出 ssh = pexpect.spawn(cmd,[],86400,logfile=sys.stdout) try: while True: #对输出进行匹配,匹配输入密码或者保存ssh密匙 i = ssh.expect(['password', 'continue connecting (yes/no)?']) if i == 0: ssh.sendline(remotePasswd) break elif i == 1: ssh.sendline('yes') except pexpect.EOF: #处理进程退出 ssh.close() else: ssh.expect(pexpect.EOF) ssh.close() print "Done" |
如果需要关闭rsync
的详细输出,可以讲上述代码中第三行的logfile=sys.stdout
删掉。
需要特别注意
rsync
在执行删除操作的时候,会对远程目录内的文件与本地文件相比对,本地不存在而远程存在的文件将会被删除,需要特别注意。
兼容性
本代码在Ubuntu 16.04 LTS
与Windows 10 + babun
中测试通过。
已有 10 条评论
发表评论
电子邮件地址不会被公开。 必填项已标注。
实力YM大D牛!
@老谢 求放过
大佬,你好
@kn007 不是大佬,求放过
实力YM大D牛!
@daozhihun 刀老师才是真大牛,全栈工程师刀之魂大木桑苏,都只会复制评论的,哈哈哈
实力YM大D牛!
@adamfei 求放过。
高手在民间~
@小李子 不要闹,好好的