【问题标题】:Paramiko SSH connection error: socket.gaierror: [Errno 8] nodename nor servname provided, or not knownParamiko SSH 连接错误:socket.gaierror: [Errno 8] nodename nor servname provided, or not known
【发布时间】:2018-02-26 02:12:14
【问题描述】:

我对 Python 和 Paramiko 有一些问题。我想连接到一个 SSH 服务器来自动读取来自不同系统的一些信息。

我尝试了一些在这里找到的提示,但没有任何效果。我检查了主机文件,使用 brew 重新安装 Python,更新/升级 Python 和 Paramiko,使用本地主机上的 ssh-server 进行测试。同时运行 pip 来更新 paramiko 和 python。

我很困惑。请让我问你。

这是我的工作环境:

  • MacOS Sierra 10.12.6
  • Python 2.7
  • 日食
  • SSH 库:Paramiko (paramiko-2.2.1-py2.py3-none-any.whl)

脚本:基本 Paramiko SSH 连接

'''
Created on 16.09.2017


'''
import sys
import telnetlib
import paramiko


host = '213.000.000.123'    # 
user = "user"
password = "password"

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, user, password)

在 Eclipse 上运行脚本会产生以下输出:

Traceback (most recent call last):
      File "/Users/tschaefer/Documents/workspace/PythonCMTSLibs/basicSSHSessionModule.py", line 17, in <module>
        ssh.connect(host, user, password)
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/paramiko/client.py", line 301, in connect
        to_try = list(self._families_and_addresses(hostname, port))
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/paramiko/client.py", line 199, in _families_and_addresses
        hostname, port, socket.AF_UNSPEC, socket.SOCK_STREAM)
    socket.gaierror: [Errno 8] nodename nor servname provided, or not known

好的,我找到了 gai=getaddrinfo,还有 getaddrbyname 等等。所以我认为将主机字符串解析为 IP 地址存在问题。但是将 IP 地址解析为 IP 地址是没有意义的。我使用了显式IP。 直接在 CLI 上使用“ssh 213.000.000.123”命令可以正常工作。

我还尝试连接到“localhost”或“127.0.0.1”或“google.com”或其他。 hosts-file-entry 没有注释,因此它处于活动状态。结果:同样的情况。

NSLOOKUP 工作正常,因此 DNS 查找工作正常并且 DNS 服务器可用。

似乎Python可以从Eclipse中找到paramiko库,但是库中存在问题。

谁能帮我看看我的眼睛看不到的东西。

非常感谢!

问候

【问题讨论】:

    标签: python eclipse ssh macos-sierra paramiko


    【解决方案1】:

    错误信息非常具有误导性。它实际上与 DNS 错误无关。

    显然 paramiko 使用的默认端口不是 22。一旦我指定了端口,问题就消失了。

    port = 22
    k = paramiko.RSAKey.from_private_key_file(key_filename)
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    hostname = os.environ['DOCKER_EE_MANAGER_NODE']
    username = os.environ['UCP_USER']
    
    ssh.connect(hostname, port, username, pkey = k)
    

    有效!享受吧!

    【讨论】:

    • 我永远不会从错误消息中发现这一点。
    • 虽然这可行,但推理不正确。 Paramiko 确实使用 22 作为默认 ssh 端口。问题在于错误地传递位置参数而不是使用关键字参数。有关详细信息,请参阅其他答案。
    【解决方案2】:

    Paramiko documentation 中,您可以看到connect 的第二个位置参数是port

    连接(主机名,端口=22,用户名=无,密码=无,pkey=无,key_filename=无,超时=无,allow_agent=True,look_for_keys=True,compress=False,sock=None,gss_auth=False , gss_kex=False, gss_deleg_creds=True, gss_host=None, banner_timeout=None, auth_timeout=None, gss_trust_dns=True, passphrase=None, disabled_algorithms=None)

    您将 user 作为第二个参数传递,但 connect 试图将其解释为 port 导致连接失败。以下是使用关键字参数修复对connect 的调用的方法。

    ssh.connect(host, username=user, password=password)
    

    【讨论】:

      猜你喜欢
      • 2021-11-24
      • 1970-01-01
      • 2020-12-11
      • 2012-11-06
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      相关资源
      最近更新 更多