Predați lui ssh2 socketul deschis prin SOCKS
Negociați mai întâi conexiunea SOCKS, apoi predați socketul ei de destinație lui ssh2 înainte de a deschide subsistemul SFTP.
ssh2 acceptă un flux deja conectat prin opțiunea sa sock. Lăsați socksv5 să stabilească ruta către serverul SSH, apoi predați acel flux către 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 este configurația SSH existentă a aplicației, inclusiv contul, cheia și politica hostVerifier. Gazda și portul SOCKS desemnează intermediarul; sshConfig.host și port desemnează serviciul SSH final.
Exemplul folosește un punct final SOCKS fără autentificare. Pentru un server SSH accesibil din internetul public, lista de proxy SOCKS5 poate oferi candidați; fiecare trebuie încă să permită destinația și portul SSH. Pentru metoda nume de utilizator/parolă, folosiți socks.auth.UserPassword(proxyUser, proxyPassword) în auths. Aceste acreditări nu înlocuiesc contul SSH.
localDNS false transmite numele gazdei de destinație serverului SOCKS, folosind rezolvarea destinației pe partea de proxy. Fără această alegere explicită, valoarea implicită documentată a socksv5 încearcă rezolvarea locală.
Callbackul SOCKS rulează după negociere. Așteptați evenimentul ready al ssh2 înainte de a solicita SFTP. Sunt etape reușite separate; nici o conexiune TCP la proxy, nici un răspuns SOCKS nu dovedesc că autentificarea SSH sau subsistemul SFTP au reușit.