phpseclib 3 SFTP через уже установленный прокси-поток
Используйте публичный конструктор потока phpseclib 3, чтобы запустить SFTP через уже установленный туннель HTTP или SOCKS.
phpseclib 3 принимает открытый ресурс потока там, где его конструктор SSH/SFTP иначе получил бы имя хоста. Это публичная точка передачи для соединения, которое уже идёт через прокси.
Сначала коннектор устанавливает туннель HTTP CONNECT или SOCKS к реальному SFTP-серверу и его порту. Затем установленный поток передаётся в 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. Интерфейс конструктора избавляет от подкласса приложения, задачей которого была бы замена внутренних полей сокета.