TR

Eğitim: SSH üzerinden bir bağlantı, adım adım

apps/hello-ssh örnek projesi, yalnızca bir SSH sunucusunun (bir bastion) erişebildiği bir Redis sunucusuna ulaşır: ssh -W host:port, bağlantının akışı Redis'e giden akıştır. Bilgisayarda sistemin ssh komutudur; tarayıcıda WebAssembly'ye derlenmiş gerçek OpenSSH istemcisi, PHP'nize bir boru ile bağlanır.

1. Uygulamayı oluşturmak

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

2. Pencere

forms/MainForm.form.yaml (apps/hello-ssh/forms/MainForm.form.yaml dosyasını kopyalayın): SSH sunucusu (sshHost, sshPort, sshUser), « Choose a key file… » düğmesi (chooseKey), anahtarın parola ifadesi (passphrase), bastion'dan görülen hedef (host, port), bir ping düğmesi, status, result.

3. Anahtar: dosya seçici

Bir tarayıcının ~/.ssh klasörü yoktur: dosya kişiden istenir. FilePicker::open() bilgisayarda VE tarayıcıda çalışır (bir tıklamadan çağırın); seçilen dosya, okunup silinen bir yola gelir. Uygulamanın anahtar halkasında saklanır ($this->engine->sshKeyring(): tarayıcıda bulunmayan bir ajanın rolü).

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

Anahtar uygulamanın depolama alanında kalır (var/ssh_keyring.json: tarayıcıda IndexedDB, bilgisayarda veri klasörü) ve sunucuya asla gönderilmez: SSH istemcisinin belleğine gider. Her bağlantı, bir ajan gibi, anahtar halkasındaki tüm anahtarları sunar.

4. Bağlanmak

$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() ile aynı olaylar. Bir Tcp alan kod için (apps/jumphpsql içindeki MySQL istemcisi gibi): $this->engine->ssh()->via($options) aynı connect($host, $port, $timeout) yöntemine sahiptir. Seçenekler: docs/ssh-wasm.md.

5. Test etmek

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. Tarayıcı: iki hak

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

Tarayıcıda iki aşama, yalnızca onaylı uygulamaları kabul eden jumphp.net'in TCP köprüsünden geçer: SSH istemcisi (WebAssembly) bastion'a bağlanır (22 numaralı port veya başka bir port) → SSH hakkı gerekir. (Bir veritabanıyla doğrudan konuşan bir SQL istemcisinin TCP hakkına ihtiyacı vardır.) Studio → proje → Accès SSH → « Demander l'accès SSH »; yönetici bunu yayımlanan commit için onaylar.

SSH hakkı daha geniştir (herkese açık bir adresin herhangi bir portu, asla özel bir adres değil): yönetici bunu yalnızca incelediği koda verir. İstatistikler, günlük, kesme ve engelleme: Administration → Pont TCP.

7. Tarayıcıda doğrulamak

jumphp.net'teki proje sayfası: anahtarınızı seçin (bilgisayarınızın dosya seçicisi açılır), bastion'u ve hedefi belirtin, « Send PING through SSH » düğmesine tıklayın: The server answered: +PONG. İlk saniyelerde « The SSH session is starting… » görünür: SSH istemcisi bir Web Worker içinde başlar (istek üzerine yüklenen 3,8 MB'lık bir dosya).

Nasıl çalıştığı (bir boruyla bağlanan iki wasm), güvenlik ve OpenSSH'ın derlenmesi: docs/ssh-wasm.md. İlk eğitim: docs/tuto-tcp.md.