2015-07-22 108 views
0

我有许多测试服务器。这些测试服务器会经常重新映像,并且在重新映像后具有相同的用户帐户和密码。我想编写一个python脚本,通过这些服务器上的ssh远程运行命令,而不会提示用户输入密码,并收集命令的输出。在某些情况下,我想运行一个命令,获取输出,分析输出。在其他情况下,我想一次运行几个命令(可能运行一个脚本文件)。我使用第三方软件包(例如paramiko)远程阅读了许多有关运行命令的帖子。有没有推荐的方式来实现这个任务,而不使用额外的软件包?运行脚本的服务器可能没有安装该软件包。通过ssh远程运行通讯的选项

或者我应该使用pexpect

理想情况下,我想使用subprocess并捕获输出(提供密码作为参数)。当然,我的脚本必须处理客户端首次登录时的情况,并提示将ssh密钥添加到.ssh/knownhosts文件中。

谢谢 艾哈迈德。

+0

我认为使用命令行工具dsh是你想要的 – muddyfish

+0

这是一个有点意见的基础。我尝试了'paramiko',这是一个很好的Python的ssh支持。但是,它确实很慢(我的情况与你的情况相同,在40个不同的帐户或服务器上运行的命令类似于100个命令)。 Paramiko真的很容易安装(它只需要'python-dev'包)。没有尝试pexpect。 – FunkySayu

+0

当我创建我的程序时,我没有找到任何好的方法来运行ssh命令而没有任何额外的库(除了通过使用'subprocess'对** ssh'命令进行系统调用,**这不是解决方案** )。 – FunkySayu

回答

0

如果主机密钥安全性不是问题(您位于可信网络等),则可以绕过主机检查。如果您使用基于密钥的认证没有必要为一个密码提示:

ssh -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no -oPasswordAuthentication=no \ 
    -n [email protected] some_cmd 

这样,如果你执行some_cmd本地你可以只使用subprocess

+0

我认为您建议的选项有助于避免回答“您确定要继续连接(是/否)?”这个问题吗?“但是,仍然需要密码。建议的选项,我得到以下错误消息:权限被拒绝(公钥,密码)。 –

+0

您需要在目标机器的'〜/ .ssh/authorized_keys'中拥有您的公钥('〜/ .ssh/id_dsa.pub')。 – Krumelur

+0

我了解你提出的解决方案。但是这些测试系统是我无法控制的,也无权告诉服务器的管理员在全新安装完成时安装这些密钥。因此,我的帖子征求了我的方法的想法。谢谢你。 –