PL

Samouczek: połączenie przez SSH, krok po kroku

Przykładowy projekt apps/hello-ssh łączy się z serwerem Redis, do którego dostęp ma tylko serwer SSH (bastion): ssh -W host:port, strumień połączenia jest strumieniem do Redisa. Na komputerze jest to ssh systemu; w przeglądarce prawdziwy klient OpenSSH skompilowany do WebAssembly, połączony z Twoim PHP potokiem.

1. Utworzyć aplikację

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

2. Okno

forms/MainForm.form.yaml (skopiuj apps/hello-ssh/forms/MainForm.form.yaml): serwer SSH (sshHost, sshPort, sshUser), przycisk « Choose a key file… » (chooseKey), hasło klucza (passphrase), cel widziany z bastionu (host, port), przycisk ping, status, result.

3. Klucz: wybieracz plików

Przeglądarka nie ma katalogu ~/.ssh: o plik prosi się użytkownika. FilePicker::open() działa na komputerze I w przeglądarce (wywołaj go z kliknięcia); wybrany plik trafia pod ścieżkę, z której się go czyta, a potem usuwa. Przechowuje się go w breloku kluczy aplikacji ($this->engine->sshKeyring(): rola agenta, którego przeglądarka nie ma).

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());
    });
}

Klucz pozostaje w pamięci masowej aplikacji (var/ssh_keyring.json: IndexedDB w przeglądarce, folder danych na komputerze) i nigdy nie jest wysyłany na serwer: trafia do pamięci klienta SSH. Każde połączenie proponuje wszystkie klucze z breloka, jak agent.

4. Połączyć się

$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

Te same zdarzenia co w tcp(). Dla kodu, który przyjmuje Tcp (jak klient MySQL z apps/jumphpsql): $this->engine->ssh()->via($options) ma to samo connect($host, $port, $timeout). Opcje: docs/ssh-wasm.md.

5. Testować

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. Przeglądarka: dwa prawa

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

W przeglądarce dwa etapy przechodzą przez most TCP jumphp.net, który przyjmuje tylko zatwierdzone aplikacje: klient SSH (WebAssembly) łączy się z bastionem (port 22 lub inny) → potrzebne jest prawo SSH. (Klient SQL, który rozmawia bezpośrednio z bazą danych, potrzebuje prawa TCP.) Studio → projekt → Accès SSH → « Demander l'accès SSH »; administrator zatwierdza je dla opublikowanego commita.

Prawo SSH jest szersze (dowolny port adresu publicznego, nigdy adres prywatny): administrator przyznaje je tylko kodowi, który obejrzał. Statystyki, dziennik, odcinanie i blokowanie: Administration → Pont TCP.

7. Sprawdzić w przeglądarce

Strona projektu na jumphp.net: wybierz swój klucz (otworzy się wybieracz plików Twojego komputera), podaj bastion i cel, kliknij « Send PING through SSH »: The server answered: +PONG. Przez pierwsze sekundy widać « The SSH session is starting… »: klient SSH uruchamia się w Web Workerze (plik 3,8 MB ładowany na żądanie).

Jak to działa (dwa wasm połączone potokiem), bezpieczeństwo i kompilacja OpenSSH: docs/ssh-wasm.md. Pierwszy samouczek: docs/tuto-tcp.md.