【问题标题】:How to check if there is a SSH hostname resolution error如何检查是否存在 SSH 主机名解析错误
【发布时间】:2014-07-04 01:49:54
【问题描述】:

我正在使用 Python 使用 scp 自动从网络传感器复制二进制文件。我想添加一些错误检查,但我不知道如何可靠地检查 SSH 是否引发错误,例如主机名解析错误。我目前正在使用 .communicate() 来收集标准输出,然后在错误消息中匹配“ssh”。我检查 err 是否以“ssh”开头的原因是因为如果没有引发错误,则该 err 变量包含它正在登录的传感器的横幅,所以我真的没有办法可靠地检查是否 err 实际上有没有价值(如果有道理的话)。如果找不到文件或抛出其他错误,我也会检查错误代码。有没有更好的方法?

这是当前工作的代码:

    sp = Popen(['scp', '@'.join([self.user, self.sensor]) + ':{0}{1}'.format(self.binPath, self.binName), self.storePath], stdout = PIPE, stderr = PIPE)
    data, error = sp.communicate()

    if error.startswith("ssh"):
        print("ERROR: {}".format(error))
    else:
        if sp.returncode == 1:
            print("ERROR:  {} - No such file or directory".format(self.binPath + self.binName))
        elif sp.returncode == 0:
            self.hashCMP(self.storePath, self.binName, md5Sum)
        else:
            pass

【问题讨论】:

  • sp.returncode == 0 表示成功,sp.returncode > 0 表示失败,无论error 值如何。将其移出else
  • 无关:"{user}@{sensor}:{binPath}{binName}".format(**vars(self))
  • 谢谢。我注意到如果我有一个 SSH 无法解析的主机名,它会在返回码检查之外失败,这就是为什么我让它解析 error 而不是只检查返回码。另外,对于您的第二个“不相关”帖子,您是否建议我将 Popen 结构更改为那个?
  • “在返回码之外失败”是什么意思?你的意思是scpsp.returncode == 0 退出并且如果self.sensor 是未知主机名则什么都不做?在我的机器上scp 在这种情况下返回sp.returncode == 1''.format 的例子表明它是可以做到的:一切都在一个地方,名称是可读的。是否使用它取决于你(例如,vars(self) 对类属性失败)
  • 感谢您的帮助,我让它正常工作。我注意到您对"{user}@{sensor}:{binPath}{binName}".format(**vars(self))" 的建议对我不起作用,它一直报告找不到文件或目录。这是对我有用的命令:Popen(["scp", "{user}@{sensor}:{binPath}{binName}".format(**vars(self)), "{storePath}".format(**vars(self))])。我还必须使用.communicate() 来获取returncode,否则它会一直报告None,因为进程不会终止。我试过.wait(),但它报告一个int对象没有属性returncode。

标签: python error-handling subprocess scp


【解决方案1】:

解决此问题的一种方法是为域创建测试吗?例如使用类似的东西:

      from socket import getaddrinfo
      result = getaddrinfo("www.google.com", None) 
      print result[0][4]

我注意到您正在使用 popen - 如果您的操作系统有 nc (netcat),您是否可以运行以下命令:

      nc -v <host> <port> #I believe this uses the getaddrinfo under the hood as well ;-)

谢谢, //P

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 2013-08-25
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多