def find_public_key(hint=None):
    """
    This looks for an appropriate SSH key to send, possibly querying
    the user in the meantime. DO NOT CALL after reactor.run as this
    (possibly) does blocking stuff like asking the user questions (via
    click.prompt())

    Returns a 3-tuple: kind, keyid, pubkey_data
    """

    if hint is None:
        hint = expanduser('~/.ssh/')
    else:
        if not exists(hint):
            raise PubkeyError("Can't find '{}'".format(hint))

    pubkeys = [f for f in os.listdir(hint) if f.endswith('.pub')]
    if len(pubkeys) == 0:
        raise PubkeyError("No public keys in '{}'".format(hint))
    elif len(pubkeys) > 1:
        got_key = False
        while not got_key:
            ans = click.prompt(
                "Multiple public-keys found:\n" +
                "\n".join(["  {}: {}".format(a, b)
                           for a, b in enumerate(pubkeys)]) +
                "\nSend which one?"
            )
            try:
                ans = int(ans)
                if ans < 0 or ans >= len(pubkeys):
                    ans = None
                else:
                    got_key = True
                    with open(join(hint, pubkeys[ans]), 'r') as f:
                        pubkey = f.read()

            except Exception:
                got_key = False
    else:
        with open(join(hint, pubkeys[0]), 'r') as f:
            pubkey = f.read()
    parts = pubkey.strip().split()
    kind = parts[0]
    keyid = 'unknown' if len(parts) <= 2 else parts[2]

    return kind, keyid, pubkey
def find_public_key ( hint = None ) : if hint is None : hint = expanduser ( '~/.ssh/' ) else : if not exists ( hint ) : raise PubkeyError ( "Can't find '{}'" . format ( hint ) ) pubkeys = [ f for f in os . listdir ( hint ) if f . endswith ( '.pub' ) ] if len ( pubkeys ) == 0 : raise PubkeyError ( "No public keys in '{}'" . format ( hint ) ) elif len ( pubkeys ) > 1 : got_key = False while not got_key : ans = click . prompt ( "Multiple public-keys found:\n" + "\n" . join ( [ "  {}: {}" . format ( a , b ) for a , b in enumerate ( pubkeys ) ] ) + "\nSend which one?" ) try : ans = int ( ans ) if ans < 0 or ans >= len ( pubkeys ) : ans = None else : got_key = True with open ( join ( hint , pubkeys [ ans ] ) , 'r' ) as f : pubkey = f . read ( ) except Exception : got_key = False else : with open ( join ( hint , pubkeys [ 0 ] ) , 'r' ) as f : pubkey = f . read ( ) parts = pubkey . strip ( ) . split ( ) kind = parts [ 0 ] keyid = 'unknown' if len ( parts ) <= 2 else parts [ 2 ] return kind , keyid , pubkey
This looks for an appropriate SSH key to send, possibly querying
    the user in the meantime. DO NOT CALL after reactor.run as this
    (possibly) does blocking stuff like asking the user questions (via
    click.prompt())

    Returns a 3-tuple: kind, keyid, pubkey_data