使用Python的子流程库避免SSH密码提示

时间:2017-08-19 09:46:10

标签: python linux ssh subprocess

我正在构建一个程序,该程序使用尽可能少的用户干预将命令发送到多个服务器。 对于这个程序,我使用subprocess通过SSH发送命令。

互动的服务器很多,而且动态。 该计划将主要由我公司的团队成员使用。 大多数服务器在/root/.ssh/authorized_keys上都有正确的文件,该程序可以很好地与它们配合使用。

但有些服务器安装不好,我们无法使用SSH连接它们而无需输入root密码。 SSH密码提示在需要{"有问题的服务器"}时需要挂起。

我如何确保程序在每次面对服务器时都会忽略,跳过并继续使用代码,因为密钥问题导致提示输入root密码并且不会挂起密码提示符?

这是我的代码:

    call_user_func_array($the_['function'], array_slice($args, 0, (int) $the_['accepted_args']));

此外,一些服务器使用端口22,一些服务器使用端口22222,这就是为什么有一个" CurrentPort"条件。

1 个答案:

答案 0 :(得分:2)

ssh有几个选项可以更好地进行批处理; man ssh是你的朋友,无论我在下面写的是什么,你都应该阅读它:

使用-o选项,您可以指定ssh_config中可以包含的任何选项。同样,文档是您的朋友,您应该阅读man sshman ssh_config。在您的特定情况下,您需要

['ssh', '-o', 'PasswordAuthentication=No', ipAddr, "-p", currentPort]

完全禁用基于密码的登录。

无论如何,如果这是一个高吞吐量的东西,也许你不想为每个连接产生一个SSH进程。看看python SSH库 - paramiko似乎是您尝试做的事情的首选库!

再往后看看你想要建造的东西:你正在重新发明轮子。试试ansible。这正是你所做的 - 控制主机列表,它有点集中于系统维护,所以它很容易制作要在每台机器上安装的软件包列表,修改配置文件以及启动服务,而不必太在意目标系统的详细信息。