Setelah pembantu HTTP CONNECT mengembalikan tunnel ke server SSH yang dituju, berikan aliran itu kepada Paramiko:

with paramiko.SSHClient() as client:
    client.load_system_host_keys()
    client.connect('ssh.example.com',
                   username='operator',
                   sock=tunnel,
                   banner_timeout=10,
                   auth_timeout=10)
    # Use the verified SSH connection.

Ganti host contoh dan muat data known-hosts yang benar untuk penerapan tersebut. tunnel harus sudah menuju server yang sama. Nama host yang diteruskan ke connect mengidentifikasi kunci host SSH, bukan proxy.

Antarmuka sock menerima socket terbuka atau objek mirip socket. Antarmuka itu tidak menegosiasikan HTTP untuk Anda. Sebelum mengembalikannya, konektor harus:

  1. Terhubung ke proxy dan mengirim permintaan CONNECT yang valid untuk tujuan.
  2. Menyelesaikan autentikasi proxy yang didukung dan memvalidasi status tunnel yang berhasil.
  3. Membaca seluruh bagian header proxy, menangani pembacaan sebagian, dan mempertahankan byte di luar batas.
  4. Membatasi penyiapan dan menutup socket yang ditolak/bermasalah melalui jalur pembersihannya.

Gunakan konektor yang terpelihara untuk pekerjaan itu. Mencari frasa keberhasilan bahasa Inggris dalam satu buffer penerimaan melewatkan baris status yang terpisah, teks alasan yang bervariasi, dan header yang tidak lengkap. Koneksi TCP proxy yang berhasil bukanlah tunnel SSH yang diterima.

Proxy harus mengizinkan port SSH yang diminta; izin penjelajahan web tidak membentuk akses CONNECT ke port 22. 407 terjadi sebelum login SSH, sedangkan kegagalan akun SSH terjadi setelah tunnel. Pisahkan kedua akun itu.

Tutup klien SSH dan sumber daya milik konektor setelah selesai. Tugas yang menghentikan pembacaannya tidak dengan sendirinya menutup koneksi yang masih hidup.

Artikel terkait