Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python控制rsync?_Python_Bash_Automation_Rsync - Fatal编程技术网

用Python控制rsync?

用Python控制rsync?,python,bash,automation,rsync,Python,Bash,Automation,Rsync,我一直想编写一个python脚本,它将按顺序运行几个rsync实例,以便将数据备份到另一台计算机 目前我只有这个文本文件和我使用的命令,我只是把它们复制粘贴到终端上,这看起来有点傻 我希望能够使用python为我做到这一点。我非常模糊地知道如何使用subprocess.popen,但我不知道如何让python直接与rsync交互,比如为我输入密码。python能做到吗 比如: if theProccess.proccessResponse == "Password:" : theProc

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

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

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

比如:

if theProccess.proccessResponse == "Password:" :
    theProccess.respond(string)
或者我能做的最好的事情就是让它,甚至是一个bash脚本,按顺序运行rsync,然后一遍又一遍地输入我的密码


提前感谢。

我使用rsync备份我所有客户的网站。一个脚本由cron触发,它为每个客户机使用makefile,因为它们的需求不同


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

如果你需要通过编程控制一个子进程,你应该考虑使用

如果您希望通常与子流程交互,可以使用其他地方提到的。但是对于您的特定情况,假设您的RSyc在SSH(默认)上运行,那么您可能需要考虑在两个主机之间建立连接,这将消除输入密码的需要。这是一种安全的方法,比在源代码中存储密码要安全得多


谁讨论了您的具体问题并决定使用无密码ssh。

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

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

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

默认情况下,它不包含任何在rsync命令中包含密码的方法,因此我修改了该模块,并在本文中讨论了它:

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


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

我很抱歉这么晚才回答,但我觉得其他人的回答都错了。他们确实回答了你的问题,但不是直接回答

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

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
接下来,我偶然发现了你的问题,因为我在寻找类似的东西。仅供其他人参考,我最终引用了以下两个堆栈溢出链接: 及

我制作了一个名为paralle_rsync的包,它并行执行rsync命令。
您可以在fabric中使用它同时在多台主机上执行操作。

我确实考虑过使用密钥对来执行此操作,但我想看看是否有可能让一个程序控制另一个程序,因为这似乎是一种技能,可以在需要交互的情况下派上用场,并且没有一个简单的解决方案可以忽略它。但无论如何,我可能会做一个钥匙对…我们在哪里找到这个包裹?它是如何获得许可的?这将与许多人相关:
Pexpect的主要功能需要Python标准库中的pty模块,该模块仅在类Unix系统上可用。
--密码文件仅适用于rsyncd机密,而不适用于您的shell密码,您还可以使用netrc库()检索要提供给pexpect.的密码,或者使用netrc()从.netrc文件获取密码,而无需每次要求用户输入密码,从而构建一个完整的工作解决方案,这与OP正在查找的密码类似