Ge ssh2 sockeln som öppnades via SOCKS
Förhandla SOCKS-anslutningen först och lämna sedan dess målsockel till ssh2 innan SFTP-undersystemet öppnas.
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.