把建立完成的 CONNECT 套接字交给 ssh2-sftp-client
保留代理响应头之后已缓冲的 SSH 问候,然后用 sock 配合目标原有的 SSH 选项。
import SftpClient from 'ssh2-sftp-client';
const client = new SftpClient();
await client.connect({
...sshOptions,
sock: tunnelSocket,
});在 sshOptions 中提供目标既有的主机、端口、账号和主机密钥策略。该套接字必须已经通过已接受的 CONNECT 隧道连接到该目标,而不只是连到代理监听器。
移交流之前先检查辅助函数:拒绝 407 或其他失败响应,保留建立连接的超时,并关闭被拒绝的套接字。Node 的 HTTP connect 事件会带上响应头之后已经读入的 head 字节;用合适的流交接方式保留非空缓冲,例如 socket.unshift(head)。其中可能包含 SSH 问候。
尽快移交套接字,然后用 await client.end() 关闭已完成的 SFTP 任务。别处的 HTTP Agent 不会创建这条 SSH 传输,CONNECT 账号与 SSH 账号也是分开的。