def test_connect(self, mock_manager): self.c.connect() # check None connection mock_manager.return_value = None with self.assertRaises(NetConfClientError) as err: self.c.connect() self.assertEqual( str(err.exception), "Connection to 'test' error: " "manager return None object") # check authentication error mock_manager.side_effect = AuthenticationError("test error") with self.assertRaises(NetConfClientError) as err: self.c.connect() self.assertEqual(str(err.exception), "Authentication failed on 'test'") # check authentication error mock_manager.side_effect = TransportError("test error") with self.assertRaises(NetConfClientError) as err: self.c.connect() self.assertEqual(str(err.exception), "Connection to 'test' error: test error")
def _auth(self, username, password, key_filenames, allow_agent, look_for_keys): saved_exception = None for key_filename in key_filenames: for cls in (paramiko.RSAKey, paramiko.DSSKey, paramiko.ECDSAKey): try: key = cls.from_private_key_file(key_filename, password) self.logger.debug("Trying key %s from %s", hexlify(key.get_fingerprint()), key_filename) self._transport.auth_publickey(username, key) return except Exception as e: saved_exception = e self.logger.debug(e) if allow_agent: for key in paramiko.Agent().get_keys(): try: self.logger.debug("Trying SSH agent key %s", hexlify(key.get_fingerprint())) self._transport.auth_publickey(username, key) return except Exception as e: saved_exception = e self.logger.debug(e) keyfiles = [] if look_for_keys: rsa_key = os.path.expanduser("~/.ssh/id_rsa") dsa_key = os.path.expanduser("~/.ssh/id_dsa") ecdsa_key = os.path.expanduser("~/.ssh/id_ecdsa") if os.path.isfile(rsa_key): keyfiles.append((paramiko.RSAKey, rsa_key)) if os.path.isfile(dsa_key): keyfiles.append((paramiko.DSSKey, dsa_key)) if os.path.isfile(ecdsa_key): keyfiles.append((paramiko.ECDSAKey, ecdsa_key)) # look in ~/ssh/ for windows users: rsa_key = os.path.expanduser("~/ssh/id_rsa") dsa_key = os.path.expanduser("~/ssh/id_dsa") ecdsa_key = os.path.expanduser("~/ssh/id_ecdsa") if os.path.isfile(rsa_key): keyfiles.append((paramiko.RSAKey, rsa_key)) if os.path.isfile(dsa_key): keyfiles.append((paramiko.DSSKey, dsa_key)) if os.path.isfile(ecdsa_key): keyfiles.append((paramiko.ECDSAKey, ecdsa_key)) for cls, filename in keyfiles: try: key = cls.from_private_key_file(filename, password) self.logger.debug("Trying discovered key %s in %s", hexlify(key.get_fingerprint()), filename) self._transport.auth_publickey(username, key) return except Exception as e: saved_exception = e self.logger.debug(e) if password is not None: try: self._transport.auth_password(username, password) return except Exception as e: saved_exception = e self.logger.debug(e) if saved_exception is not None: # need pep-3134 to do this right raise AuthenticationError(repr(saved_exception)) raise AuthenticationError("No authentication methods available")
def _auth(self, username, password, key_filenames, allow_agent, look_for_keys): saved_exception = None for key_filename in key_filenames: for cls in (paramiko.RSAKey, paramiko.DSSKey, paramiko.ECDSAKey, paramiko.Ed25519Key): try: key = cls.from_private_key_file(key_filename, password) self.logger.debug("Trying key %s from %s", hexlify(key.get_fingerprint()), key_filename) self._transport.auth_publickey(username, key) return except Exception as e: saved_exception = e self.logger.debug(e) if allow_agent: # resequence keys from agent using private key names prepend_agent_keys = [] append_agent_keys = list(paramiko.Agent().get_keys()) for key_filename in key_filenames: pubkey_filename = key_filename.strip(".pub") + ".pub" try: file_key = paramiko.PublicBlob.from_file( pubkey_filename).key_blob except (FileNotFoundError, ValueError): continue for idx, agent_key in enumerate(append_agent_keys): if agent_key.asbytes() == file_key: self.logger.debug( "Prioritising SSH agent key found in %s", key_filename) prepend_agent_keys.append(append_agent_keys.pop(idx)) break agent_keys = tuple(prepend_agent_keys + append_agent_keys) for key in agent_keys: try: self.logger.debug("Trying SSH agent key %s", hexlify(key.get_fingerprint())) self._transport.auth_publickey(username, key) return except Exception as e: saved_exception = e self.logger.debug(e) keyfiles = [] if look_for_keys: rsa_key = os.path.expanduser("~/.ssh/id_rsa") dsa_key = os.path.expanduser("~/.ssh/id_dsa") ecdsa_key = os.path.expanduser("~/.ssh/id_ecdsa") if os.path.isfile(rsa_key): keyfiles.append((paramiko.RSAKey, rsa_key)) if os.path.isfile(dsa_key): keyfiles.append((paramiko.DSSKey, dsa_key)) if os.path.isfile(ecdsa_key): keyfiles.append((paramiko.ECDSAKey, ecdsa_key)) # look in ~/ssh/ for windows users: rsa_key = os.path.expanduser("~/ssh/id_rsa") dsa_key = os.path.expanduser("~/ssh/id_dsa") ecdsa_key = os.path.expanduser("~/ssh/id_ecdsa") if os.path.isfile(rsa_key): keyfiles.append((paramiko.RSAKey, rsa_key)) if os.path.isfile(dsa_key): keyfiles.append((paramiko.DSSKey, dsa_key)) if os.path.isfile(ecdsa_key): keyfiles.append((paramiko.ECDSAKey, ecdsa_key)) for cls, filename in keyfiles: try: key = cls.from_private_key_file(filename, password) self.logger.debug("Trying discovered key %s in %s", hexlify(key.get_fingerprint()), filename) self._transport.auth_publickey(username, key) return except Exception as e: saved_exception = e self.logger.debug(e) if password is not None: try: self._transport.auth_password(username, password) return except Exception as e: saved_exception = e self.logger.debug(e) if saved_exception is not None: # need pep-3134 to do this right raise AuthenticationError(repr(saved_exception)) raise AuthenticationError("No authentication methods available")