用Python控制rsync?

时间:2009-11-01 16:36:52

标签: python bash automation rsync

我一直想编写一个python脚本,它会按顺序运行几个rsync实例,以便将数据备份到另一台计算机。

目前我只是将这个文本文件包含在我使用的命令中,而我只是将它们复制粘贴到终端中,看起来有点傻。

我希望能够使用python为我这样做。我非常清楚地知道如何使用subprocess.popen,但我不知道如何让python直接与rsync交互,比如输入我的密码。蟒蛇可以这样做吗?

类似的东西:

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

或者我能做的最好的就是拥有它,甚至是bash脚本,只需按顺序运行rsyncs并且必须反复输入我的密码?

提前致谢。

8 个答案:

答案 0 :(得分:21)

如果您想与一般的子流程进行交互,可以使用其他地方提到的pexpect。但是对于您的特定情况,假设您的rsync在ssh(默认值)上运行,那么您可能需要考虑在两台主机之间建立passwordless ssh连接,这样就无需输入密码。这是一个key-based solution,比将密码存储在源代码中要安全得多。

Here's a blogger谁讨论了您的确切问题,并决定使用无密码的ssh。

答案 1 :(得分:7)

有一个很棒的Python模块,由Colin Stewart编写,名为RSyncBackup,鲜为人知,但很少有文档记录,但非常有用。

默认情况下,它不包含在rsync命令中包含密码的任何方法,因此我在此博客文章中修改了模块并进行了讨论:http://technofart.blogspot.com/2012/02/rsync-controlled-by-python.html

我修改后的模块的链接可以在我的帖子的下载部分找到。

基于密钥的解决方案也是一个好主意。此外,许多rsync实现将查找您可以设置的RSYNC_PASSWORD环境变量。如果您的环境变量对其他用户可见,请注意。

答案 2 :(得分:6)

我使用rsync来备份我所有客户的网站。脚本由cron触发,并且由于它们的不同需求,它为每个客户端使用Makefile。

使用ssh-keygen创建公钥/私钥对并将公钥放在远程计算机上,而不是输入密码。这为您提供安全,无密码的连接。这也意味着您不必将rsync端口暴露给全世界。在你完成了这个学习曲线之后(而且不是很陡峭),ssh绝对肯定你的朋友。

答案 3 :(得分:2)

我感觉不好,因为回答这么晚,但我觉得其他人的答案都是错的。他们做了KINDA回答你的问题,但没有直接回答他们的问题。

更重要的是,您曾询问如何以交互方式获取密码。为此,我建议使用内置的getpass。简而言之,您没有与rsync交互。在执行rsync之前,您正在从用户RIGHT获取密码,并将其传递给rsync。另一种选择是允许用户将其作为选项传递,我的大多数命令行脚本都使用optparse

import getpass
password = getpass.getpass('Password for %s: ' % opts.user)
try:
    #code that uses password
except Exception, e:
    # test to see if str(e) is really an invalid password error, if so tell the user and return or loop, up to you
    # else 
    raise Exception(e) # the error that was raised in the first place

继续,我偶然发现了你的问题,因为我正在寻找类似的东西。对于那里的其他任何人来说,我最后引用了这两个堆栈溢出链接: calling rsync from python subprocess.callPython Subprocess.Popen from a thread

答案 4 :(得分:1)

如果您需要以编程方式控制子流程,则应考虑使用pexpect

答案 5 :(得分:1)

我不认为它支持开箱即用的rsync,但paramiko可能有一些你可以回收的组件?

答案 6 :(得分:0)

如果您只需输入密码,可以尝试填充RSYNC_PASSWORD环境变量或使用--password-file选项。

答案 7 :(得分:0)

我创建了一个名为paralle_rsync的软件包,可并行执行rsync命令。 您可以在结构中使用它同时在多个主机上执行操作。