def _get_server_keys(hostname): server_keys = [] # key_type_list = ["ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256"] # default key_type used by ssh-keysca # Supported key_type for OS # alinux ssh-rsa,ssh-ed25519,ecdsa-sha2-nistp256 # ubuntu1404 ssh-rsa,ssh-ed25519,ecdsa-sha2-nistp256 # ubuntu1604 ssh-rsa,ssh-ed25519,ecdsa-sha2-nistp256 # centos7 ssh-rsa,ssh-ed25519,ecdsa-sha2-nistp256 # centos6 ssh-rsa key_type_list = ["ssh-rsa"] for key_type in key_type_list: transport = None try: sock = socket.socket() sock.settimeout(5) sock.connect((hostname, 22)) transport = Transport(sock) transport._preferred_keys = [key_type] transport.start_client() server_keys.append(transport.get_remote_server_key()) except Exception: pass finally: if transport: transport.close() if not server_keys: logging.error("Failed retrieving server key from host '%s'", hostname) return hostname, [(server_key.get_base64(), server_key.get_name()) for server_key in server_keys]
def _on_open_port(args): host, port, socket = args try: ssh_conn = Transport(socket) if key_type is not None: new_preferred_keys = [key_type] new_preferred_keys.extend(ssh_conn._preferred_keys) ssh_conn._preferred_keys = tuple(new_preferred_keys) try: ssh_conn.start_client() key = ssh_conn.get_remote_server_key() key_md5 = md5(str(key)).hexdigest() fingerprint = ':'.join( a + b for a, b in zip(key_md5[::2], key_md5[1::2])) data_cb(host, port, True, (key.get_name(), fingerprint, b64encode(str(key)))) finally: ssh_conn.close() except (socket_error, NoValidConnectionsError): data_cb(host, port, None, None) except Exception as e: data_cb(host, port, False, 'Exception: {}: {}'.format(type(e), str(e))) finally: socket.close()