强制rsync进入非交互模式

我想在一个Python脚本中使用rsync。 我使用subprocess模块调用它,并使用存储在远程机器上authorized_key文件中的公钥进行身份validation。

唯一的问题是,当我使用错误的远程用户名使用rsync时,系统会提示input密码,这明显会暂停备份脚本。

如果无法进行身份validation,而不是提示input密码,是否可以强制rsync退出?

乌迪

假设您使用rsync与SSH远程shell(而不是 – 例如 – 与rsync服务器),那么您可以让rsync以永不会要求input密码的方式运行SSH。 例如,一次可以使用这个调用:

 rsync -e 'ssh -o "NumberOfPasswordPrompts 0"' source user@target:/path 

这将强制rsync使用SSH进行0次可能的密码尝试 – 如果使用其他身份validation方法(如公用密钥或GSSAPI)无法访问,则会失败,并显示错误消息。 请注意,当发生这种情况时,rsync不会喜欢你,并会向STDERR大声抱怨,并退出代码255。

这里是我用来保持安静的ssh的命令行选项。

ssh -o stricthostkeychecking=no -o userknownhostsfile=/dev/null -o batchmode=yes -o passwordauthentication=no

如果您不维护您的known_hosts文件并且担心获取MitM警告,您只需要hostkey的东西。 我没有按照James F的build议来指定authenticationtypes,而是必须明确地限制密码authentication。 但是,我用这个命令打了几百个有不同操作系统版本的主机,所以这可能只是一个不兼容的问题。

重新:詹姆斯的build议(不给tty),对于subprocess,尝试把stdin = None作为参数给Popen。

首先从shell中获取rsync工作,命令应该如下所示。

如果没有通过自己debuggingssh命令。 当所有的作品,然后看看python脚本会发生什么

这不是一个糟糕的教程

根据你如何启动rsync,不给TTY或PTY可能有帮助。

许多程序在决定提示用户input之前检查它们是否具有控制TTY。 system()和类似的调用的默认行为是为子程序提供一个tty,但是你可以禁用它。

如果您同时控制两个系统,并且希望在解决此问题时为了安全利益而取消密码validation,则也可以完全禁用远程端的密码validation。

如果您通过SSH进行rsync,则可以将以下内容添加到相关主机的ssh_config文件中,或通过-o命令行开关添加:

 PreferredAuthentications publickey 

在一个快速testing(只是SSH,而不是rsync),导致SSH立即退出时,我的公钥没有被接受,没有提示我input密码。