Перадайце ssh2 сокет, адкрыты праз SOCKS
Спачатку ўзгадніце злучэнне SOCKS, затым перадайце яго сокет прызначэння ў ssh2 перад адкрыццём падсістэмы SFTP.
ssh2 прымае ўжо злучаны паток праз опцыю sock. Няхай socksv5 пракладзе маршрут да сервера SSH, а затым перадайце гэты паток у 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 — гэта існуючая канфігурацыя SSH праграмы, уключаючы яе ўліковы запіс, ключ і палітыку hostVerifier. Хост і порт SOCKS пазначаюць пасярэдніка; sshConfig.host і port пазначаюць канчатковы сэрвіс SSH.
Прыклад выкарыстоўвае канчатковы пункт SOCKS без аўтэнтыфікацыі. Для сервера SSH, даступнага з публічнага інтэрнэту, спіс проксі SOCKS5 можа даць кандыдатаў; кожны з іх павінен дазваляць прызначэнне і порт SSH. Для метаду імя карыстальніка/пароль выкарыстоўвайце socks.auth.UserPassword(proxyUser, proxyPassword) у auths. Гэтыя ўліковыя даныя не замяняюць уліковы запіс SSH.
localDNS false перадае імя хоста прызначэння серверу SOCKS, выкарыстоўваючы развязанне прызначэння на баку проксі. Без гэтага відавочнага выбару дакументаваны тыповы рэжым socksv5 спрабуе лакальнае развязанне.
Зваротны выклік SOCKS выконваецца пасля ўзгаднення. Чакайце падзеі ready ад ssh2, перш чым запытваць SFTP. Гэта асобныя паспяховыя этапы; ні TCP-злучэнне з проксі, ні адказ SOCKS не даказваюць, што аўтэнтыфікацыя SSH або падсістэма SFTP былі паспяховымі.