Esempio n. 1
0
 def _get_client(self):
     if self._client:
         return self._client
     try:
         self._client = paramiko.SSHClient()
         self._client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
         self._client.connect(self.host,
                              username=self.user,
                              port=self.port,
                              pkey=self.pkey,
                              key_filename=self.key_filename,
                              password=self.password,
                              timeout=1)
         return self._client
     except Exception as e:
         message = ("Exception %(exception_type)s was raised "
                    "during connect to %(user)s@%(host)s:%(port)s. "
                    "Exception value is: %(exception)r")
         self._client = False
         raise exceptions.SSHError(
             message % {
                 "exception": e,
                 "user": self.user,
                 "host": self.host,
                 "port": self.port,
                 "exception_type": type(e)
             })
Esempio n. 2
0
 def _get_pkey(self, key):
     if isinstance(key, six.string_types):
         key = six.moves.StringIO(key)
     errors = []
     for key_class in (paramiko.rsakey.RSAKey, paramiko.dsskey.DSSKey):
         try:
             return key_class.from_private_key(key)
         except paramiko.SSHException as e:
             errors.append(e)
     raise exceptions.SSHError("Invalid pkey: %s" % (errors))
Esempio n. 3
0
 def _get_pkey(self, key):
     if isinstance(key, str):
         key = io.StringIO(key)
     errors = []
     key_pos = key.seek(0, 1)
     for key_class in (paramiko.rsakey.RSAKey, paramiko.dsskey.DSSKey):
         try:
             return key_class.from_private_key(key)
         except paramiko.SSHException as e:
             key.seek(key_pos)
             errors.append(e)
     raise exceptions.SSHError("Invalid pkey: %s" % (errors))
Esempio n. 4
0
    def _run(self,
             client,
             cmd,
             stdin=None,
             stdout=None,
             stderr=None,
             raise_on_error=True,
             timeout=3600):

        if isinstance(cmd, (list, tuple)):
            cmd = " ".join(six.moves.shlex_quote(str(p)) for p in cmd)

        transport = client.get_transport()
        session = transport.open_session()
        session.exec_command(cmd)
        start_time = time.time()

        data_to_send = ""
        stderr_data = None

        # If we have data to be sent to stdin then `select' should also
        # check for stdin availability.
        if stdin and not stdin.closed:
            writes = [session]
        else:
            writes = []

        data = None
        while True:
            # Block until data can be read/write.
            r, w, e = select.select([session], writes, [session], 1)

            if session.recv_ready():
                data = session.recv(4096)
                LOG.debug("stdout: %r" % data)
                if stdout is not None:
                    stdout.write(data.decode("utf8"))
                continue

            if session.recv_stderr_ready():
                stderr_data = session.recv_stderr(4096)
                LOG.debug("stderr: %r" % stderr_data)
                if stderr is not None:
                    stderr.write(stderr_data.decode("utf8"))
                continue

            if session.send_ready():
                if stdin is not None and not stdin.closed:
                    if not data_to_send:
                        data_to_send = stdin.read(4096)
                        if not data_to_send:
                            stdin.close()
                            session.shutdown_write()
                            writes = []
                            continue
                    sent_bytes = session.send(data_to_send)
                    LOG.debug("sent: %s" % data_to_send[:sent_bytes])
                    data_to_send = data_to_send[sent_bytes:]

            if session.exit_status_ready():
                break

            if timeout and (time.time() - timeout) > start_time:
                args = {"cmd": cmd, "host": self.host}
                raise exceptions.SSHTimeout("Timeout executing command "
                                            "'%(cmd)s' on host %(host)s" %
                                            args)
            if e:
                raise exceptions.SSHError("Socket error.")

        exit_status = session.recv_exit_status()
        if 0 != exit_status and raise_on_error:
            fmt = "Command '%(cmd)s' failed with exit_status %(status)d."
            details = fmt % {"cmd": cmd, "status": exit_status}
            if stderr_data:
                details += " Last stderr data: '%s'." % stderr_data
            raise exceptions.SSHError(details)
        return exit_status, data