ssh2 tar emot en redan ansluten ström via sitt sock-alternativ. Låt socksv5 etablera vägen till SSH-servern och lämna sedan den strömmen till 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 är programmets befintliga SSH-konfiguration, inklusive kontot, nyckeln och hostVerifier-policyn. SOCKS-värden och -porten anger mellanhanden; sshConfig.host och port anger den slutliga SSH-tjänsten.

Exemplet använder en SOCKS-slutpunkt utan autentisering. För en SSH-server som nås från det publika internet kan SOCKS5-proxylistan ge kandidater; var och en måste fortfarande tillåta SSH-målet och -porten. Använd socks.auth.UserPassword(proxyUser, proxyPassword) i auths för användarnamn/lösenordsmetoden. Dessa uppgifter ersätter inte SSH-kontot.

localDNS false skickar målvärdens namn till SOCKS-servern och använder måluppslagning på proxy-sidan. Utan det uttryckliga valet försöker socksv5:s dokumenterade standard med lokal uppslagning.

SOCKS-återanropet körs efter förhandlingen. Vänta på ssh2:s ready-händelse innan SFTP begärs. Det är separata lyckade faser; varken en TCP-anslutning till proxyn eller ett SOCKS-svar bevisar att SSH-autentiseringen eller SFTP-undersystemet lyckades.

Relaterade artiklar