我想在一个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密码。