Geef ssh2 de socket die via SOCKS is geopend
Onderhandel eerst de SOCKS-verbinding en geef daarna de bestemmingssocket aan ssh2 voordat het SFTP-subsysteem wordt geopend.
ssh2 accepteert een al verbonden stream via zijn sock-optie. Laat socksv5 de route naar de SSH-server opzetten en geef die stream daarna aan 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 is de bestaande SSH-configuratie van de applicatie, inclusief het account, de sleutel en het hostVerifier-beleid. De SOCKS-host en -poort wijzen de tussenpersoon aan; sshConfig.host en port wijzen de uiteindelijke SSH-dienst aan.
Het voorbeeld gebruikt een SOCKS-eindpunt zonder authenticatie. Voor een SSH-server die vanaf het openbare internet bereikbaar is, kan de SOCKS5-proxylijst kandidaten leveren; elk moet nog steeds de SSH-bestemming en -poort toestaan. Gebruik voor de gebruikersnaam/wachtwoordmethode socks.auth.UserPassword(proxyUser, proxyPassword) in auths. Die inloggegevens vervangen het SSH-account niet.
localDNS false geeft de hostnaam van de bestemming door aan de SOCKS-server en gebruikt bestemmingsresolutie aan de proxykant. Zonder die expliciete keuze probeert de gedocumenteerde standaard van socksv5 lokale resolutie.
De SOCKS-callback draait na de onderhandeling. Wacht op de ready-gebeurtenis van ssh2 voordat SFTP wordt aangevraagd. Dit zijn afzonderlijke geslaagde fasen; noch een TCP-verbinding met de proxy noch een SOCKS-antwoord bewijst dat de SSH-authenticatie of het SFTP-subsysteem is geslaagd.