سلّم 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 ومنفذه خدمة SSH النهائية.
يستخدم المثال نقطة نهاية SOCKS بلا مصادقة. بالنسبة إلى خادم SSH يمكن الوصول إليه من الإنترنت العام، يمكن أن توفر قائمة وكلاء SOCKS5 مرشحين؛ ولا يزال كل منها بحاجة إلى السماح بوجهة SSH ومنفذها. لطريقة اسم المستخدم/كلمة المرور، استخدم socks.auth.UserPassword(proxyUser, proxyPassword) في auths. لا تحل تلك البيانات محل حساب SSH.
localDNS false يمرر اسم مضيف الوجهة إلى خادم SOCKS، مستخدمًا تحليل الوجهة من جانب الوكيل. ومن دون هذا الاختيار الصريح، يحاول الإعداد الافتراضي الموثق في socksv5 التحليل المحلي.
يعمل رد نداء SOCKS بعد التفاوض. انتظر حدث ready في ssh2 قبل طلب SFTP. هاتان مرحلتان ناجحتان منفصلتان؛ فلا اتصال TCP بالوكيل ولا رد SOCKS يثبت نجاح مصادقة SSH أو النظام الفرعي SFTP.