得到异常错误“线程Thread-1中的异常(很可能在解释器关闭期间引发)”使用Paramiko

时间:2011-12-24 17:14:33

标签: python paramiko

我编写了一个简单的程序,通过paramiko创建SSH连接,然后执行一个简单的命令。但它总是抛出异常错误: -

  

Thread-1中的异常(很可能是在解释器期间引发的)   关闭):Traceback(最近一次调用最后一次):文件   “/usr/lib/python2.7/threading.py”,第530行,在__bootstrap_inner中   文件“/usr/lib/python2.7/site-packages/paramiko/transport.py”,行   1574,在运行中:'NoneType'对象有   没有属性'错误'

我写的程序如下: -

    class Session:

      def __init__(self, ipaddr, username, password):
        self.ipaddr = ipaddr
        self.username = username
        self.password = password

        self.connect()

      def connect(self):
        try:
          time.sleep(1)
          self.ssh = paramiko.SSHClient()
          self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

          try:
            self.ssh.connect(self.ipaddr, username=self.username, password=self.password)
            time.sleep(2)
          except socket.error, e:
            print e
            self.ssh.close()
            sys.exit()

        except Exception, e:
          print e

  def executeCmd(self, cmd):
    data = ""
    try:
      stdin, stdout, stderr = self.ssh.exec_command(cmd)
      data = stdout.read()
    except SSHException, e:
      print "Error: ", e
      errorMsg = "Error: %s" %traceback.format_exc()
      print errorMsg

    return data

  def __del__(self):
    self.ssh.close()

如何解决此异常?请帮忙。

由于

1 个答案:

答案 0 :(得分:1)

这是我之前找到并使用的示例代码,对我来说很好。

import os
import tempfile
import paramiko

class Connection(object):
        """Connects and logs into the specified hostname. 
        Arguments that are not given are guessed from the environment.""" 

        def __init__(self,
         host,
         username = None,
         private_key = None,
         password = None,
         port = 22,
         ):
                self._sftp_live = False
                self._sftp = None
                if not username:
                        username = os.environ['LOGNAME']

                # Log to a temporary file.
                templog = tempfile.mkstemp('.txt', 'ssh-')[1]
                paramiko.util.log_to_file(templog)

                # Begin the SSH transport.
                self._transport = paramiko.Transport((host, port))
                self._tranport_live = True
                # Authenticate the transport.
                if password:
                # Using Password.
                        self._transport.connect(username = username, password = password)
                else:
                # Use Private Key.
                        if not private_key:
                        # Try to use default key.
                                if os.path.exists(os.path.expanduser('~/.ssh/id_rsa')):
                                        private_key = '~/.ssh/id_rsa'
                                elif os.path.exists(os.path.expanduser('~/.ssh/id_dsa')):
                                        private_key = '~/.ssh/id_dsa'
                        else:
                                raise TypeError, "You have not specified a password or key."
                        private_key_file = os.path.expanduser(private_key)
                        rsa_key = paramiko.RSAKey.from_private_key_file(private_key_file)
                        self._transport.connect(username = username, pkey = rsa_key)

        def _sftp_connect(self):
                """Establish the SFTP connection."""
                if not self._sftp_live:
                        self._sftp = paramiko.SFTPClient.from_transport(self._transport)
                        self._sftp_live = True
        def get(self, remotepath, localpath = None):
                """Copies a file between the remote host and the local host."""
                if not localpath:
                        localpath = os.path.split(remotepath)[1]
                self._sftp_connect()
                self._sftp.get(remotepath, localpath)

        def put(self, localpath, remotepath = None):
                """Copies a file between the local host and the remote host."""
                if not remotepath:
                        remotepath = os.path.split(localpath)[1]
                self._sftp_connect()
                self._sftp.put(localpath, remotepath)

        def execute(self, command):
                """Execute the given commands on a remote machine."""
                channel = self._transport.open_session()
                channel.exec_command(command)
                output = channel.makefile('rb', -1).readlines()
                if output:
                        return output
                else:
                        return channel.makefile_stderr('rb', -1).readlines()
        def close(self):
                """Closes the connection and cleans up."""
                # Close SFTP Connection.
                if self._sftp_live:
                        self._sftp.close()
                        self._sftp_live = False
        # Close the SSH Transport.
                if self._tranport_live:
                        self._transport.close()
                        self._tranport_live = False
        def __del__(self):
                """Attempt to clean up if not explicitly closed."""
                self.close()