UK

Посібник: з'єднання через 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.