Python 如何检查是否存在SSH主机名解析错误
我正在使用Python,使用scp自动从网络传感器复制二进制文件。我想添加一些错误检查,但我不知道如何可靠地检查SSH是否抛出错误,例如主机名解析错误。我目前正在使用.communicate()收集标准输出,然后在错误消息中匹配“ssh”。我检查err是否以“ssh”开头的原因是,如果没有抛出错误,err变量包含它登录到的传感器的标题,因此我无法真正可靠地检查err是否确实有值(如果有意义的话)。我还在检查错误代码,以防找不到文件或抛出其他错误。有更好的方法吗 这是当前的工作代码:Python 如何检查是否存在SSH主机名解析错误,python,error-handling,subprocess,scp,Python,Error Handling,Subprocess,Scp,我正在使用Python,使用scp自动从网络传感器复制二进制文件。我想添加一些错误检查,但我不知道如何可靠地检查SSH是否抛出错误,例如主机名解析错误。我目前正在使用.communicate()收集标准输出,然后在错误消息中匹配“ssh”。我检查err是否以“ssh”开头的原因是,如果没有抛出错误,err变量包含它登录到的传感器的标题,因此我无法真正可靠地检查err是否确实有值(如果有意义的话)。我还在检查错误代码,以防找不到文件或抛出其他错误。有更好的方法吗 这是当前的工作代码: sp
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
解决这个问题的一种方法是为域创建一个测试吗?例如,使用以下内容:
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 ;-)
nc-v#我相信这也使用了引擎盖下的getaddrinfo;-)
谢谢,
//P
sp.returncode==0
表示成功,sp.returncode>0
表示失败,无论错误值如何。将其移出else
blockunrelated:“{user}@{sensor}:{binPath}{binName}”。格式(**vars(self))
谢谢。我注意到,如果我有一个SSH无法解析的主机名,它会在返回代码检查之外失败,这就是为什么我让它解析error
,而不是只检查返回代码。另外,对于你的第二篇“不相关”的帖子,你是否建议我将我的Popen结构更改为该结构?它是什么意思“在returncode之外失败”?您的意思是说scp
退出时sp.returncode==0
,如果self.sensor
是未知主机名,则不执行任何操作?在我的机器上,在这种情况下,scp
返回sp.returncode==1
。带有'.format
的示例表明,它是可以做到的:所有内容都在一个地方,并且名称是可读的。是否使用它取决于您(例如,vars(self)
类属性失败),多亏了您的帮助,我让它正常工作。我要注意的一点是,你的{user}{sensor}:{binPath}{binName}.format(**vars(self))“
对我不起作用,它一直报告找不到文件或目录。这是对我起作用的命令:Popen([“scp”,{user}{sensor sensor}:{binPath}{binName}.format(**vars(self)),“{storePath}.format(**vars(self
。我还必须使用.communicate()
来获取返回代码
,否则它会继续报告无
,因为进程不会终止。我尝试了.wait()
,但它报告int对象没有returncode属性。