通过已建立的代理流使用 phpseclib 3 的 SFTP
使用 phpseclib 3 的公开流构造函数,通过已建立的 HTTP 或 SOCKS 隧道启动 SFTP。
phpseclib 3 接受一个已打开的流资源,而其 SSH/SFTP 构造函数通常接收的是主机名。对于已经经由代理承载的连接,这就是公开的交接点。
首先,连接器建立到真实 SFTP 服务器及其端口的 HTTP CONNECT 或 SOCKS 隧道。然后把已建立的流交给 SFTP:
use phpseclib3\Net\SFTP;
$sftp = new SFTP($tunnel);
$actualHostKey = $sftp->getServerPublicHostKey();
if ($actualHostKey === false
|| !hash_equals($expectedHostKey, $actualHostKey)) {
throw new RuntimeException('Unexpected SFTP server key');
}
if (!$sftp->login($sftpUser, $sftpCredential)) {
throw new RuntimeException('SFTP login failed');
}
$tunnel 是已连接的流,不是代理 URL。$expectedHostKey 是服务器受信任的公钥字符串,通过应用的配置流程获得,格式与 phpseclib 返回的一致。登录凭据可以是受支持的密码,也可以是应用选择的已加载密钥对象。
定义连接器返回什么
该流必须已经通向 SFTP 服务器。对于 HTTP CONNECT,这意味着代理已接受目标,并且 完整的代理响应头已被消费。对于 SOCKS,相关协商必须已成功完成。任何已越过该边界读取的 SSH 字节都必须仍可供 SSH 实现使用。
此时 phpseclib 执行 SSH 交换,并在同一流上启动 SFTP。应用可以使用其常规的 SFTP 操作。构造函数接口避免了编写一个专门替换内部套接字字段的应用子类。