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()
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
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
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}