使用 Paramiko SFTP 实现服务器端文件复制:需要有关自定义扩展的指导

问题描述 投票:0回答:1

我目前正在做一个项目,涉及到在服务器端使用Paramiko的SFTP进行服务器端文件复制操作。 我正在寻求有关如何使用 Paramiko 实现服务器端文件复制操作的指导。具体来说,我想向 Paramiko 添加一个支持“复制文件”操作的自定义扩展或挂钩。

详情:

  • 使用Paramiko作为服务器
  • Paramiko 版本: 3.3.0
  • Python 版本: 3.9.11
  • 操作系统:Windows 11
  • SSH 服务器: OpenSSH v9.4.0

观察结果:

我已经浏览了 Paramiko 文档和示例,但找不到有关实现服务器端文件复制操作的明确指导。我尝试将

extension_pairs
(第161行)中的
paramiko/sftp.py
修改为[“copy-file”,“md5,sha1”],但似乎无法识别。我怀疑这绝对不是正确的方法,我正在寻找有关添加自定义扩展的正确方法的指导。

这是我认为客户端日志中表示它不起作用的有用部分

debug2: channel_input_status_confirm: type 99 id 0
debug2: subsystem request accepted on channel 0
debug2: Remote version: 3
debug2: Unrecognised server extension "copy-data"
Connected to 127.0.0.1.
debug2: Sending SSH2_FXP_REALPATH "."
debug3: Sent message fd 6 T:16 I:1
debug3: SSH2_FXP_REALPATH . -> /
sftp> cp foo bart
Server does not support copy-data extension

问题:

  1. 如何向 Paramiko 添加自定义扩展或挂钩以支持服务器端文件复制操作?
  2. 我可以利用现有的钩子或方法来实现此目的吗?

感谢任何可以指导我走上正确道路或提供有关使用 Paramiko 实现服务器端文件复制的见解的人。

这个问题也在github问题上提出:https://github.com/paramiko/paramiko/issues/2336

python sftp paramiko
1个回答
0
投票

Paramiko

SFTPServer
类似乎没有任何机制来实现自定义扩展。

您所能做的就是重写

_process
方法并自行处理
t == CMD_EXTENDED
。但您必须再次实施所有(两个)现有扩展。

类似:

class MySFTPServer(SFTPServer):
    def _process(self, t, request_number, msg):
        if t == CMD_EXTENDED:
            # Copy of CMD_EXTENDED implementation from SFTPServer._process
            tag = msg.get_text()
            if tag == "check-file":
                self._check_file(request_number, msg)
            elif tag == "[email protected]":
                oldpath = msg.get_text()
                newpath = msg.get_text()
                self._send_status(
                    request_number, self.server.posix_rename(oldpath, newpath)
                )
            elif tag == "copy-file":
                oldpath = msg.get_text()
                newpath = msg.get_text()
                # Your copy-file implementation
                # ... 
            else:
                self._send_status(request_number, SFTP_OP_UNSUPPORTED)
        else:
            super(SFTPServer, self)._process(t, request_number, msg)

(未经测试)

© www.soinside.com 2019 - 2024. All rights reserved.