Passa a ssh2 il socket aperto tramite SOCKS
Negozia prima la connessione SOCKS, poi passa il suo socket di destinazione a ssh2 prima di aprire il sottosistema SFTP.
ssh2 accetta uno stream già connesso tramite la sua opzione sock. Lascia che socksv5 stabilisca la rotta verso il server SSH, poi passa quello stream a 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 è la configurazione SSH esistente dell'applicazione, inclusi account, chiave e criterio hostVerifier. L'host e la porta SOCKS identificano l'intermediario; sshConfig.host e port identificano il servizio SSH finale.
L'esempio usa un endpoint SOCKS senza autenticazione. Per un server SSH raggiungibile da Internet pubblico, la lista di proxy SOCKS5 può fornire candidati; ognuno deve comunque consentire la destinazione e la porta SSH. Per il suo metodo nome utente/password, usa socks.auth.UserPassword(proxyUser, proxyPassword) in auths. Quelle credenziali non sostituiscono l'account SSH.
localDNS false passa il nome host di destinazione al server SOCKS, usando la risoluzione della destinazione lato proxy. Senza questa scelta esplicita, l'impostazione predefinita documentata di socksv5 tenta la risoluzione locale.
Il callback SOCKS viene eseguito dopo la negoziazione. Attendi l'evento ready di ssh2 prima di richiedere SFTP. Sono fasi riuscite distinte; né una connessione TCP al proxy né una risposta SOCKS dimostrano che l'autenticazione SSH o il sottosistema SFTP abbiano avuto successo.