def mkdir(self, path: Text, attr: SFTPAttributes) -> int: self.session.sftp_client_ready.wait() if self.session.sftp_client is None: raise MissingClient("self.session.sftp_client is None!") if attr.st_mode is None: return paramiko.sftp.SFTP_FAILURE return self.session.sftp_client.mkdir(path, attr.st_mode)
def open(self, path: Text, flags: int, attr: SFTPAttributes) -> Union[SFTPHandle, int]: try: self.session.sftp_client_ready.wait() if self.session.sftp_client is None: raise MissingClient("self.session.sftp_client is None!") # Code aus dem StubSFTPServer der Paramiko Demo auf GitHub if (flags & os.O_CREAT) and attr: attr._flags &= ~attr.FLAG_PERMISSIONS # type: ignore if flags & os.O_WRONLY: if flags & os.O_APPEND: fstr = 'ab' else: fstr = 'wb' elif flags & os.O_RDWR: if flags & os.O_APPEND: fstr = 'a+b' else: fstr = 'r+b' else: # O_RDONLY (== 0) fstr = 'rb' try: if self.session.sftp_client is None: return paramiko.sftp.SFTP_FAILURE client_f = self.session.sftp_client.open(path, fstr) except Exception: logging.exception("Error file") return paramiko.sftp.SFTP_FAILURE sftp_handler = self.session.proxyserver.sftp_handler sftp_file_handle = sftp_handler.get_file_handle() fobj = sftp_file_handle(self.session, sftp_handler, path) # writeonly if fstr in ('wb', 'ab'): fobj.writefile = client_f # readonly elif fstr == 'rb': fobj.readfile = client_f # read and write elif fstr in ('a+b', 'r+b'): fobj.writefile = client_f fobj.readfile = client_f if fobj.writefile: self.chattr(path, attr) return fobj except (OSError, IOError) as e: logging.exception("Error") return paramiko.SFTPServer.convert_errno(e.errno) except Exception: logging.exception("Error") return paramiko.sftp.SFTP_FAILURE
def lstat(self, path: Text) -> Union[SFTPAttributes, int]: self.session.sftp_client_ready.wait() args, _ = SFTPProxyReplaceHandler.parser().parse_known_args() if self.session.sftp_client is None: raise MissingClient("self.session.sftp_client is None!") stat_remote = self.session.sftp_client.lstat(path) if isinstance(stat_remote, int): return stat_remote stat_replace = SFTPAttributes.from_stat( os.stat(args.sftp_replacement_file)) stat_remote.st_size = stat_replace.st_size return stat_remote
def __init__(self, session: 'ssh_proxy_server.session.Session') -> None: super().__init__() if session.ssh_client is None or session.ssh_client.transport is None: raise MissingClient("session.ssh_client is None") self.server_channel: paramiko.Channel = session.ssh_client.transport.open_session( ) if session.agent is not None: session.agent.forward_agent(self.server_channel) self.channel: Optional[paramiko.Channel] = None self.session: 'Session' = session # pass environment variables from client to server for env_name, env_value in self.session.env_requests.items(): self.server_channel.set_environment_variable(env_name, env_value)
def chattr(self, path: Text, attr: SFTPAttributes) -> int: self.session.sftp_client_ready.wait() if self.session.sftp_client is None: raise MissingClient("self.session.sftp_client is None!") if attr.st_mode: return self.session.sftp_client.chmod(path, attr.st_mode) remotestat = self.stat(path) if isinstance(remotestat, int): return remotestat oldattr = paramiko.SFTPAttributes.from_stat( cast(os.stat_result, remotestat)) if not attr.st_uid: attr.st_uid = oldattr.st_uid if not attr.st_gid: attr.st_gid = oldattr.st_gid if attr.st_uid is None or attr.st_gid is None: return paramiko.sftp.SFTP_FAILURE return self.session.sftp_client.chown(path, attr.st_uid, attr.st_gid)
def lstat(self, path: Text) -> Union[SFTPAttributes, int]: self.session.sftp_client_ready.wait() if self.session.sftp_client is None: raise MissingClient("self.session.sftp_client is None!") return self.session.sftp_client.lstat(path)
def list_folder(self, path: Text) -> Union[List[SFTPAttributes], int]: self.session.sftp_client_ready.wait() if self.session.sftp_client is None: raise MissingClient("self.session.sftp_client is None!") return self.session.sftp_client.listdir_attr(path)
def symlink(self, targetPath: Text, path: Text) -> int: self.session.sftp_client_ready.wait() if self.session.sftp_client is None: raise MissingClient("self.session.sftp_client is None!") return self.session.sftp_client.symlink(targetPath, path)
def rmdir(self, path: Text) -> int: self.session.sftp_client_ready.wait() if self.session.sftp_client is None: raise MissingClient("self.session.sftp_client is None!") return self.session.sftp_client.rmdir(path)
def rename(self, oldpath: Text, newpath: Text) -> int: self.session.sftp_client_ready.wait() if self.session.sftp_client is None: raise MissingClient("self.session.sftp_client is None!") return self.session.sftp_client.rename(oldpath, newpath)
def readlink(self, path: Text) -> Union[Text, int]: self.session.sftp_client_ready.wait() if self.session.sftp_client is None: raise MissingClient("self.session.sftp_client is None!") return self.session.sftp_client.readlink(path)