Adam Matan Asked: 2009-07-13 06:21:25 +0800 CST2009-07-13 06:21:25 +0800 CST 2009-07-13 06:21:25 +0800 CST 强制 rsync 进入非交互模式 772 我想在 python 脚本中使用 rsync。我使用模块调用它,并使用存储在远程机器上subprocess的文件中的公钥进行身份验证。authorized_key 唯一的问题是,当我使用错误的远程用户名使用 rsync 时,系统会提示我输入密码,这显然会永远停止备份脚本。 rsync如果无法验证,我可以强制退出,而不是提示输入密码吗? 乌迪 rsync shell 5 个回答 Voted Best Answer Guss 2009-07-13T12:11:45+08:002009-07-13T12:11:45+08:00 假设您将 rsync 与 SSH 远程 shell 一起使用(而不是 - 例如 - 与 rsync 服务器一起使用),那么您可以让 rsync 以永远不会询问密码的方式运行 SSH。例如,一次可以使用这个调用: rsync -e 'ssh -o "NumberOfPasswordPrompts 0"' source user@target:/path 这将强制 rsync 在 0 次可能的密码尝试中使用 SSH - 如果它无法使用其他一些身份验证方法(如公钥或 GSSAPI)获得访问权限,那么它将失败并出现错误。请注意,当这种情况发生时,rsync 不会喜欢你,并且会大声向 STDERR 抱怨并以退出代码 255 中断。 Chad Huneycutt 2009-07-14T09:31:04+08:002009-07-14T09:31:04+08:00 这是我用来保持安静的 ssh 命令行选项。 ssh -o stricthostkeychecking=no -o userknownhostsfile=/dev/null -o batchmode=yes -o passwordauthentication=no 如果您不维护您的 known_hosts 文件并且担心收到 MitM 警告,您只需要 hostkey 的东西。我没有按照 James F 的建议指定身份验证类型,而是必须明确限制密码身份验证。不过,我用它来攻击数百台具有几个不同操作系统版本的主机,所以它可能只是不兼容。 Adam Brand 2009-07-13T08:33:04+08:002009-07-13T08:33:04+08:00 回复:詹姆斯的建议(不给它 tty),对于子进程,尝试将 stdin=None 作为 Popen 的参数。 James F 2009-07-13T08:28:39+08:002009-07-13T08:28:39+08:00 根据您启动 rsync 的方式,不给它一个 TTY 或 PTY 可能会有所帮助。 许多程序在决定提示用户输入之前检查它们是否有控制 TTY。system() 和类似调用的默认行为是为子程序提供一个 tty,但您可以禁用它。 如果您同时控制两个系统并希望在解决此问题的同时避免密码身份验证以获得安全优势,也可以在远程完全禁用密码身份验证。 如果您通过 SSH 执行 rsync,您可以将以下内容添加到相关主机的 ssh_config 文件中,或通过 -o 命令行开关: PreferredAuthentications publickey 在一个快速测试(只是 ssh,而不是 rsync)中,当我的公钥不被接受而没有提示我输入密码时,导致 SSH 立即退出。 James 2009-07-13T08:29:12+08:002009-07-13T08:29:12+08:00 首先让 rsync 从 shell 工作,命令应该是这样的。 如果失败,请自行调试 ssh 命令。当一切正常时,看看python脚本会发生什么 这不是一个糟糕的教程
假设您将 rsync 与 SSH 远程 shell 一起使用(而不是 - 例如 - 与 rsync 服务器一起使用),那么您可以让 rsync 以永远不会询问密码的方式运行 SSH。例如,一次可以使用这个调用:
这将强制 rsync 在 0 次可能的密码尝试中使用 SSH - 如果它无法使用其他一些身份验证方法(如公钥或 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 的建议指定身份验证类型,而是必须明确限制密码身份验证。不过,我用它来攻击数百台具有几个不同操作系统版本的主机,所以它可能只是不兼容。
回复:詹姆斯的建议(不给它 tty),对于子进程,尝试将 stdin=None 作为 Popen 的参数。
根据您启动 rsync 的方式,不给它一个 TTY 或 PTY 可能会有所帮助。
许多程序在决定提示用户输入之前检查它们是否有控制 TTY。system() 和类似调用的默认行为是为子程序提供一个 tty,但您可以禁用它。
如果您同时控制两个系统并希望在解决此问题的同时避免密码身份验证以获得安全优势,也可以在远程完全禁用密码身份验证。
如果您通过 SSH 执行 rsync,您可以将以下内容添加到相关主机的 ssh_config 文件中,或通过 -o 命令行开关:
在一个快速测试(只是 ssh,而不是 rsync)中,当我的公钥不被接受而没有提示我输入密码时,导致 SSH 立即退出。
首先让 rsync 从 shell 工作,命令应该是这样的。
如果失败,请自行调试 ssh 命令。当一切正常时,看看python脚本会发生什么
这不是一个糟糕的教程