强制rsync进入非交互模式


8

我想在python脚本中使用rsync。我使用subprocess模块调用它,并使用存储在authorized_key远程计算机上文件中的公共密钥进行身份验证。

唯一的问题是,当我使用错误的远程用户名使用rsync时,系统会提示我输入密码,这显然会永远终止备份脚本。

rsync如果无法验证,是否可以强制退出并提示错误?

乌迪

Answers:


9

假设您将rsync与SSH远程shell一起使用(而不是-例如,与rsync服务器一起使用),则可以使rsync以永远不会要求输入密码的方式运行SSH。例如,一次可以使用此调用:

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

这将强制rsync使用SSH进行0次可能的密码尝试-如果它无法使用其他身份验证方法(如公共密钥或GSSAPI)获得访问权限,则它将失败并显示错误。请注意,rsync会在这种情况下不喜欢您,并且会向STDERR大声抱怨,并以退出代码255中断。


5

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

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

仅当您不维护known_hosts文件并且担心收到MitM警告时,才需要主机密钥。与其指定James F所建议的身份验证类型,不如明确限制密码身份验证。但是,我用它来击中具有几个不同OS版本的数百台主机,因此这可能只是不兼容。


1
请不要使用这些设置。请参阅Oreilly的“ SSH,安全Shell:权威指南,第二版”的11.5节。根据这本书的内容:“不幸的是,有效地跳过服务器身份验证会禁用SSH安全性的重要部分:抵抗服务器主机欺骗和中间人攻击!这种情况也使得定期更换服务器密钥不切实际,因为应该或在已知密钥被泄露的情况下撤销密钥(即,告诉客户不再信任它)。”
米克,

1
@Mick:这类批评的麻烦在于,它们在某些情况下是完全不合适的。例如,我在一个环境中工作,其中rsync操作的目标通常是埋在实验室内部的专用网络中的大量嵌入式系统。根本没有与外界的连接,构建系统需要能够将更新的代码向下推送到目标上。这是ssh和rsync的完全合法使用,显而易见的解决方案是关闭主机检查。对此做一个绝对规则毫无意义。
2013年

@Stabledog-我的建议是绝大多数用例的正确建议。但是,我承认,当您不相信不良行为者可以合理地获取对您的网络的访问权限以执行MiTM攻击时,可以选择一个弱安全配置。实验室环境(如您所述)所需的安全配置显然会与生产环境不同,因为可以自然地降低风险。
米克,

很公平。但是,这是哲学上的关注点,也是实践上的关注点:ssh的价值远高于其安全能力,实际上……在我所见过的大多数设置中,安全性是最不重要的关注点。它只是各种远程连接的首选瑞士军刀。因此,在“安全主义者”的指责与真实的人们每天都在以日常实用的方式使用它的方式之间存在这种脱节。我不认为我们都是傻瓜,而纯粹主义者是“正确的”。这是一个知道何时要护理的问题。
2013年

1

回复:James的建议(不给它tty),对于子进程,尝试将stdin = None作为Popen的参数。



0

根据您启动rsync的方式,不给它TTY或PTY可能会有所帮助。

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

如果您同时控制两个系统,并且希望在解决此问题的同时避免使用密码验证以获取安全性,则还可能完全在远程侧禁用密码验证。

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

PreferredAuthentications publickey

快速测试(仅ssh而不是rsync)导致在不提示我输入密码而不接受我的公钥时SSH立即退出。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.