RU

Руководство: соединение через SSH, шаг за шагом

Пример проекта apps/hello-ssh обращается к серверу Redis, который может достичь только SSH-сервер (бастион): ssh -W host:port, поток соединения — это поток к Redis. На компьютере это ssh системы; в браузере — настоящий клиент OpenSSH, скомпилированный в WebAssembly, связанный с вашим PHP каналом.

1. Создать приложение

bin/jumphp gui:new mon-ssh "Mon SSH" && bin/jumphp install mon-ssh

2. Окно

forms/MainForm.form.yaml (скопируйте apps/hello-ssh/forms/MainForm.form.yaml): SSH-сервер (sshHost, sshPort, sshUser), кнопка « Choose a key file… » (chooseKey), парольная фраза ключа (passphrase), цель, видимая с бастиона (host, port), кнопка ping, status, result.

3. Ключ: выбор файла

В браузере нет папки ~/.ssh: файл запрашивают у человека. FilePicker::open() работает на компьютере И в браузере (вызывайте его из клика); выбранный файл оказывается по пути, который читают, а затем удаляют. Его хранят в связке ключей приложения ($this->engine->sshKeyring(): роль агента, которого в браузере нет).

public function onChooseKey(Button $sender): void
{
    FilePicker::open(['title' => 'SSH private key'])->then(function (?string $file): void {
        if ($file === null) { return; }                                   // annulé
        $text = (string)file_get_contents($file);
        unlink($file);
        $this->engine->sshKeyring()->add(basename($file), $text, $this->passphrase->text);   // nom, clé, phrase secrète
        $this->keyState->text = 'Keys: ' . implode(', ', $this->engine->sshKeyring()->names());
    });
}

Ключ остаётся в хранилище приложения (var/ssh_keyring.json: IndexedDB в браузере, папка данных на компьютере) и никогда не отправляется на сервер: он попадает в память клиента SSH. Каждое соединение предлагает все ключи из связки, как агент.

4. Подключиться

$options = ['sshHost' => 'bastion.exemple.com', 'sshPort' => 22, 'sshUser' => 'moi', 'sshKeys' => $this->engine->sshKeyring()->all()];
$connection = $this->engine->ssh()->connect('127.0.0.1', 6379, $options);      // 127.0.0.1:6379 vu depuis le bastion
$connection->on('open', fn () => $connection->write("PING\r\n"));
$connection->on('data', fn (string $bytes) => $this->result->text = trim($bytes));
$connection->on('error', fn (string $m) => $this->result->text = $m);          // « Permission denied (publickey) », « Could not resolve hostname »...
$connection->on('knownHosts', fn (string $text) => $this->engine->storage->writeJson('known_hosts.json', ['text' => $text]));   // l'empreinte du serveur, gardée

Те же события, что и у tcp(). Для кода, принимающего Tcp (как MySQL-клиент из apps/jumphpsql): у $this->engine->ssh()->via($options) тот же connect($host, $port, $timeout). Опции: docs/ssh-wasm.md.

5. Проверить

bin/jumphp test mon-ssh      # le trousseau, les champs manquants, un ssh qui n'atteint pas son serveur (le message dit pourquoi)
bin/jumphp shot mon-ssh
bin/jumphp run mon-ssh       # sur l'ordinateur : le ssh du système (votre agent et ~/.ssh marchent aussi)

6. Браузер: два права

bin/jumphp build mon-ssh && bin/jumphp serve mon-ssh

В браузере два звена проходят через TCP-мост jumphp.net, который принимает только разрешённые приложения: SSH-клиент (WebAssembly) подключается к бастиону (порт 22 или другой) → нужно право SSH. (SQL-клиенту, который говорит с базой напрямую, нужно право TCP.) Studio → проект → Accès SSH → « Demander l'accès SSH »; администратор разрешает его для опубликованного коммита.

Право SSH шире (любой порт публичного адреса, но не частный адрес): администратор даёт его только коду, который просмотрел. Статистика, журнал, отключение и блокировка: Administration → Pont TCP.

7. Проверить в браузере

Страница проекта на jumphp.net: выберите свой ключ (откроется окно выбора файла вашего компьютера), укажите бастион и цель, нажмите « Send PING through SSH »: The server answered: +PONG. Первые секунды показывается « The SSH session is starting… »: SSH-клиент запускается в Web Worker (файл 3,8 МБ, загружаемый по требованию).

Как это работает (два wasm, связанные каналом), безопасность и компиляция OpenSSH: docs/ssh-wasm.md. Первое руководство: docs/tuto-tcp.md.