我目前正在做一个项目,涉及到在服务器端使用Paramiko的SFTP进行服务器端文件复制操作。 我正在寻求有关如何使用 Paramiko 实现服务器端文件复制操作的指导。具体来说,我想向 Paramiko 添加一个支持“复制文件”操作的自定义扩展或挂钩。
详情:
观察结果:
我已经浏览了 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
问题:
感谢任何可以指导我走上正确道路或提供有关使用 Paramiko 实现服务器端文件复制的见解的人。
这个问题也在github问题上提出:https://github.com/paramiko/paramiko/issues/2336
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)
(未经测试)