Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何检查是否存在SSH主机名解析错误_Python_Error Handling_Subprocess_Scp - Fatal编程技术网

Python 如何检查是否存在SSH主机名解析错误

Python 如何检查是否存在SSH主机名解析错误,python,error-handling,subprocess,scp,Python,Error Handling,Subprocess,Scp,我正在使用Python,使用scp自动从网络传感器复制二进制文件。我想添加一些错误检查,但我不知道如何可靠地检查SSH是否抛出错误,例如主机名解析错误。我目前正在使用.communicate()收集标准输出,然后在错误消息中匹配“ssh”。我检查err是否以“ssh”开头的原因是,如果没有抛出错误,err变量包含它登录到的传感器的标题,因此我无法真正可靠地检查err是否确实有值(如果有意义的话)。我还在检查错误代码,以防找不到文件或抛出其他错误。有更好的方法吗 这是当前的工作代码: sp

我正在使用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

解决这个问题的一种方法是为域创建一个测试吗?例如,使用以下内容:

      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属性。