【问题标题】:Options to run a commnd remotely over ssh通过 ssh 远程运行命令的选项
【发布时间】:2015-07-22 07:26:27
【问题描述】:

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

或者我应该使用pexpect 吗?

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

谢谢你, 艾哈迈德。

【问题讨论】:

  • 我认为使用命令行工具dsh是你想要的
  • 这有点基于意见。我尝试了paramiko,这是对 Python 的一个很好的 ssh 支持。但是,它真的很慢(我的情况和你一样,在 40 个不同的帐户或服务器上运行 100 个命令)。 Paramiko 很容易独立安装(它只需要python-dev 包)。没试过 pexpect。
  • 当我制作我的程序时,我没有找到任何在没有任何额外库的情况下运行 ssh 命令的好方法(除了使用subprocessssh 命令进行系统调用,这不是解决方案)。
  • 您可以使用fabric、paramiko(较低级别)或子流程。你需要在你的机器上输入密码还是你的机器上有你的 ssh 密钥?
  • 使用附加包有什么问题?这是您遇到的限制还是只是想知道?我会去pexpect 我发现这种情况非常方便,但我想这真的是个人喜好。

标签: python python-3.x ssh


【解决方案1】:

如果主机密钥安全不是问题(您在受信任的网络上等),您可以绕过主机检查。如果您使用基于密钥的身份验证,则无需密码提示:

ssh -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no -oPasswordAuthentication=no \
  -n doctor@tardis some_cmd

这样你就可以像在本地执行some_cmd一样使用subprocess

【讨论】:

  • 我认为您建议的选项有助于避免回答“您确定要继续连接(是/否)吗?”的问题。但是,仍然需要密码。使用建议的选项,我收到以下错误消息:权限被拒绝(公钥,密码)。
  • 您需要在目标机器的~/.ssh/authorized_keys 中拥有您的公钥(~/.ssh/id_dsa.pub)。
  • 我了解您提出的解决方案。但是这些是我无法控制的测试系统,也没有权限告诉服务器管理员在全新安装完成时安装这些密钥。因此,我发帖征求有关我的方法的想法。不过谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 2012-03-06
  • 1970-01-01
相关资源
最近更新 更多