コード例 #1
0
def SecureCopy(
        user,
        host,
        src,
        dest,  # pylint: disable=too-many-arguments
        key_filename=None,
        allow_agent=True):
    ssh = paramiko.SSHClient()
    ssh.load_system_host_keys()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    keys = []
    pkey = None
    if key_filename is not None:
        key = _load_key(key_filename)
        keys.append(key)
    if allow_agent:
        agent = paramiko.agent.Agent()
        for key in agent.get_keys():
            keys.append(key)

    ssh.connect(host, username=user, pkey=pkey)

    scp = SCPClient(ssh.get_transport())

    scp.get(src, dest)
    scp.close()
コード例 #2
0
def open_remote_device(args, file='/dev/input/event0'):
    """
    Open a remote input device via SSH.

    Args:
        args: argparse arguments
        file (str): path to the input device on the device
    Returns:
        (paramiko.ChannelFile): read-only stream of input events
    """
    log.info("Connecting to input '{}' on '{}'".format(file, args.address))

    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    pkey = None
    password = None

    agent = paramiko.agent.Agent()

    if args.key is not None:
        password = None
        try:
            pkey = paramiko.RSAKey.from_private_key_file(os.path.expanduser(args.key))
        except paramiko.ssh_exception.PasswordRequiredException:
            passphrase = getpass(
                "Enter passphrase for key '{}': ".format(os.path.expanduser(args.key))
            )
            pkey = paramiko.RSAKey.from_private_key_file(
                os.path.expanduser(args.key),
                password=passphrase
            )
    elif args.password:
        password = args.password
        pkey = None
    elif not agent.get_keys():
        password = getpass(
            "Password for '{}': ".format(args.address)
        )
        pkey = None

    client.connect(
        args.address,
        username='******',
        password=password,
        pkey=pkey,
        look_for_keys=False
    )

    session = client.get_transport().open_session()

    paramiko.agent.AgentRequestHandler(session)

    # Start reading events
    _, stdout, _ = client.exec_command('cat ' + file)

    print("connected to", args.address)

    return stdout
コード例 #3
0
def _load_keys(key_filename=None, allow_agent=True):
    keys = []
    default_key_path = join(expanduser("~"), '.ssh', 'id_rsa')
    if key_filename is not None:
        key = _load_key(key_filename)
        keys.append(key)

    if allow_agent:
        agent = paramiko.agent.Agent()
        for key in agent.get_keys():
            keys.append(key)

    if not keys and isfile(default_key_path):
        key = _load_key(default_key_path)
        keys.append(key)

    if not keys:
        raise CLIError('No keys available in ssh agent or no key in {}. '
                       'Do you need to add keys to your ssh agent via '
                       'ssh-add or specify a --ssh-key-file?'.format(default_key_path))

    return keys
コード例 #4
0
def open_rm_inputs(*, address, key, password):
    """
    Open a remote input device via SSH.

    Args:
        address (str): address to reMarkable
        key (str, optional): path to reMarkable ssh key
        password (str, optional): reMarkable ssh password
    Returns:
        (paramiko.ChannelFile): read-only stream of pen events
        (paramiko.ChannelFile): read-only stream of touch events
        (paramiko.ChannelFile): read-only stream of button events
    """
    log.debug("Connecting to input '{}'".format(address))

    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    pkey = None
    password = None

    agent = paramiko.agent.Agent()

    def use_key(key):
        try:
            pkey = paramiko.RSAKey.from_private_key_file(
                os.path.expanduser(key))
        except paramiko.ssh_exception.PasswordRequiredException:
            passphrase = getpass("Enter passphrase for key '{}': ".format(
                os.path.expanduser(key)))
            pkey = paramiko.RSAKey.from_private_key_file(
                os.path.expanduser(key), password=passphrase)
        return pkey

    if key is not None:
        password = None
        pkey = use_key(key)
    elif os.path.exists(default_key):
        password = None
        pkey = use_key(default_key)
    elif password:
        pkey = None
    elif not agent.get_keys():
        password = getpass("Password for '{}': ".format(address))
        pkey = None

    client.connect(address,
                   username='******',
                   password=password,
                   pkey=pkey,
                   look_for_keys=False)

    session = client.get_transport().open_session()

    paramiko.agent.AgentRequestHandler(session)

    pen_file = client.exec_command('readlink -f /dev/input/touchscreen0'
                                   )[1].read().decode('utf8').rstrip('\n')

    # handle both reMarkable versions
    # https://github.com/Eeems/oxide/issues/48#issuecomment-690830572
    if pen_file == '/dev/input/event0':
        # rM 1
        touch_file = '/dev/input/event1'
        button_file = '/dev/input/event2'
    else:
        # rM 2
        touch_file = '/dev/input/event2'
        button_file = '/dev/input/event0'

    log.debug('Pen:{}\nTouch:{}\nButton:{}'.format(pen_file, touch_file,
                                                   button_file))

    # Start reading events
    pen = client.exec_command('cat ' + pen_file)[1]
    touch = client.exec_command('cat ' + touch_file)[1]
    button = client.exec_command('cat ' + button_file)[1]

    return {'pen': pen, 'touch': touch, 'button': button}