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. Інтерфейс конструктора позбавляє від підкласу застосунку, завданням якого була б заміна внутрішніх полів сокета.

Схожі статті