18

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

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

我希望能够使用 python 为我做这件事。我非常模糊地知道如何使用 subprocess.popen,但我不知道如何让 python 直接与 rsync 交互,比如为我输入密码。蟒蛇能做到吗?

就像是:

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

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

提前致谢。

4

8 回答 8

21

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

这是一位博主,他讨论了您的确切问题并决定使用无密码 ssh。

于 2009-11-01T17:15:00.293 回答
7

Colin Stewart 编写了一个很棒的 Python 模块,称为 RSyncBackup,它鲜为人知,文档也很少,但非常有用。

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

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

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

于 2010-12-22T23:17:44.743 回答
6

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

与其做一些输入密码的事情,不如使用 ssh-keygen 创建一个公钥/私钥对并将您的公钥放在远程机器上。这为您提供安全的无密码连接。这也意味着您不必向世界公开 rsync 端口。在您通过了这方面的学习曲线(而且不是很陡峭)之后,ssh绝对是您的朋友。

于 2009-11-01T16:42:13.887 回答
2

不好意思,这么晚才回答,但我觉得其他人的回答都是错误的。他们确实有点回答你的问题,但不是直接回答你的问题。

更重要的是,您曾问过如何以交互方式获取密码。为此,我建议使用内置的 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

要继续,我偶然发现了您的问题,因为我正在寻找类似的东西。仅供参考,我最终引用了其中两个堆栈溢出链接: 从 python subprocess.call 调用 rsync从线程调用 Python Subprocess.Popen

于 2013-09-20T19:10:00.537 回答
1

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

于 2009-11-01T16:47:14.157 回答
1

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

于 2009-11-01T22:00:48.063 回答
0

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

于 2010-06-08T21:39:03.230 回答
0

我制作了一个名为 parallel_sync 的 python 包,它并行执行 rsync 命令。您可以在 Fabric 内部或外部使用它来同时在多个主机上执行操作。

它是开源的。GNU 许可证。 https://github.com/kouroshparsa/parallel_sync

随时要求改进或贡献。

于 2015-10-25T19:46:43.950 回答