【问题标题】:Opening an SSH session in Python with only standard libraries仅使用标准库在 Python 中打开 SSH 会话
【发布时间】:2019-01-21 18:26:59
【问题描述】:

我正在尝试修复最初在 Python 2.X 中开发的一段代码。我必须使用所有标准库,删除 paramiko,并且需要保持功能相同。可以看到,有端口号配置,用户名,密码等。有什么建议吗?

我尝试了其他 SSH 选项,但都没有奏效。它返回一个错误。

def grab_and_post_inventory_data(machine_name):
try:
    if not USEKEYFILE?: ssh.connect(str(machine_name), port=PORT, username=USER, password=PASSWORD, timeout=TIMEOUT)
    else: ssh.connect(str(machine_name), port=PORT, username=USER, key_filename=KEY_FILE, timeout=TIMEOUT)
except paramiko.AuthenticationException:
    print(machine_name + ': authentication failed')
    return None
except Exception as err:
    print(machine_name + ":" + err)
    return  None
devargs = {}

输出是一个错误,说 ssh 未定义。没有 ssh 库。我尝试了其他解决方案,但无济于事。有任何想法吗?同样,我只需要使用标准库并删除 paramiko。

【问题讨论】:

  • 如果你没有ssh 库,我唯一能想到的就是使用subprocess 库运行ssh 命令。甚至不要考虑尝试使用套接字自己实现 SSH 协议。
  • 在子进程中实现用户名、密码、端口等的最佳方式是什么?你能举个例子吗?
  • 用户名和端口可以指定为ssh 命令的参数。最好通过使用公钥身份验证来避免密码。如果你需要解析提示,整个事情会很复杂,这就是他们为它编写库的原因。

标签: python linux python-3.x ssh paramiko


【解决方案1】:

subprocess.Popen() 如果没有可用的库,则使用 subprocess.Popen() 控制本地 ssh 会话。这是一种超级原始的做事方式,如果可以避免,不推荐。

import subprocess
import sys

HOST="www.example.org"
# Ports are handled in ~/.ssh/config since we use OpenSSH
COMMAND="uname -a"

ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],
                       shell=False,
                       stdout=subprocess.PIPE,
                       stderr=subprocess.PIPE)
result = ssh.stdout.readlines()
if result == []:
    error = ssh.stderr.readlines()
    print >>sys.stderr, "ERROR: %s" % error
else:
    print result

但推荐的方法是使用 paramiko 作为 ssh 客户端和服务器。它将处理所有低级操作。使用起来非常简单。

【讨论】:

  • 谢谢!我也需要能够争论密码。
猜你喜欢
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 2014-05-13
  • 2016-08-06
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多