用Python控制rsync?

18 投票
9 回答
25942 浏览
提问于 2025-04-15 15:34

我一直想写一个Python脚本,让它顺序运行几个rsync命令,把数据备份到另一台电脑上。

现在我只是有一个文本文件,里面写着我用的命令,然后我每次都复制粘贴到终端里,这样感觉有点傻。

我想用Python来帮我完成这个工作。我对如何使用subprocess.popen有一点模糊的了解,但我完全不知道怎么让Python直接和rsync互动,比如帮我输入密码。Python能做到这一点吗?

像这样:

if theProccess.proccessResponse == "Password:" :
    theProccess.respond(string)

还是说我最好的办法就是让它,或者甚至是一个bash脚本,顺序运行rsync命令,然后我还得一次又一次地输入我的密码?

提前谢谢你。

9 个回答

6

我用rsync来备份我所有客户的网站。一个脚本是通过cron定时触发的,每个客户都有自己的Makefile,因为他们的需求不同。

与其每次都输入密码,不如使用ssh-keygen来生成一对公钥和私钥,然后把你的公钥放到远程机器上。这样你就可以实现安全的无密码连接了。这也意味着你不需要把rsync的端口暴露给外界。虽然一开始学习这个可能有点难,但其实并不复杂,掌握后ssh绝对会成为你的好帮手。

7

有一个很棒的Python模块,叫做RSyncBackup,是Colin Stewart写的,虽然不太知名,也没有太多文档,但非常实用。

这个模块默认没有提供在rsync命令中加入密码的方法,所以我对这个模块进行了修改,并在我的博客文章中讲述了这个过程:http://technofart.blogspot.com/2012/02/rsync-controlled-by-python.html

你可以在我文章的下载部分找到我修改过的模块链接。

使用密钥的解决方案也是个不错的主意。此外,很多rsync的实现会查找名为RSYNC_PASSWORD的环境变量,你可以设置这个变量。不过,要小心,如果你的环境变量对其他用户可见的话。

21

如果你想和一个子进程进行交互,可以使用pexpect,在其他地方也提到过。不过针对你的具体情况,假设你的rsync是通过ssh运行的(这是默认设置),那么你可能想考虑在两个主机之间设置一个无密码ssh连接,这样就不需要每次都输入密码了。这是一种基于密钥的解决方案,比把密码存储在源代码中要安全得多。

这里有一位博主讨论了你遇到的具体问题,并决定使用无密码ssh。

撰写回答