ssh2 รับสตรีมที่เชื่อมต่อแล้วผ่านตัวเลือก sock ของมัน ให้ socksv5 สร้างเส้นทางไปยังเซิร์ฟเวอร์ SSH แล้วส่งสตรีมนั้นให้ SSH:

const socks = require('socksv5');
const { Client } = require('ssh2');

const connection = socks.connect({
  host: sshConfig.host,
  port: sshConfig.port || 22,
  proxyHost: 'proxy.example',
  proxyPort: 1080,
  localDNS: false,
  auths: [socks.auth.None()],
}, socket => {
  const ssh = new Client();
  ssh.on('error', error => console.error(error.message));
  ssh.on('ready', () => {
    ssh.sftp((error, sftp) => {
      if (error) {
        console.error(error.message);
        ssh.end();
        return;
      }
      sftp.readdir('.', (error, entries) => {
        if (error) console.error(error.message);
        else console.log(entries);
        ssh.end();
      });
    });
  });
  ssh.connect({ ...sshConfig, sock: socket });
});
connection.on('error', error => console.error(error.message));

sshConfig คือการกำหนดค่า SSH ที่มีอยู่ของแอปพลิเคชัน รวมถึงบัญชี คีย์ และนโยบาย hostVerifier โฮสต์และพอร์ตของ SOCKS ระบุตัวกลาง; sshConfig.host และ port ระบุบริการ SSH สุดท้าย

ตัวอย่างใช้ปลายทาง SOCKS โดยไม่มีการพิสูจน์ตัวตน สำหรับเซิร์ฟเวอร์ SSH ที่เข้าถึงได้จากอินเทอร์เน็ตสาธารณะ รายการพร็อกซี SOCKS5 สามารถให้ผู้สมัครได้ แต่ละรายยังต้องอนุญาตปลายทางและพอร์ต SSH สำหรับวิธีชื่อผู้ใช้/รหัสผ่าน ให้ใช้ socks.auth.UserPassword(proxyUser, proxyPassword) ใน auths ข้อมูลรับรองเหล่านั้นไม่ได้แทนที่บัญชี SSH

localDNS false ส่งชื่อโฮสต์ปลายทางไปยังเซิร์ฟเวอร์ SOCKS โดยใช้การแปลงชื่อปลายทางฝั่งพร็อกซี หากไม่มีการเลือกที่ชัดเจนนี้ ค่าเริ่มต้นที่เอกสารของ socksv5 จะลองแปลงชื่อในเครื่อง

callback ของ SOCKS ทำงานหลังการเจรจา รอเหตุการณ์ ready ของ ssh2 ก่อนขอ SFTP สิ่งเหล่านี้เป็นขั้นตอนที่สำเร็จแยกจากกัน การเชื่อมต่อ TCP ไปยังพร็อกซีหรือการตอบกลับ SOCKS ไม่ได้พิสูจน์ว่าการพิสูจน์ตัวตน SSH หรือระบบย่อย SFTP สำเร็จ

บทความที่เกี่ยวข้อง