Đưa cho ssh2 socket được mở qua SOCKS
Thương lượng kết nối SOCKS trước, sau đó chuyển socket đích của nó cho ssh2 trước khi mở hệ thống con SFTP.
ssh2 chấp nhận một luồng đã kết nối sẵn thông qua tùy chọn sock của nó. Hãy để socksv5 thiết lập tuyến đến máy chủ SSH, rồi chuyển luồng đó cho 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 là cấu hình SSH hiện có của ứng dụng, bao gồm tài khoản, khóa và chính sách hostVerifier. Máy chủ và cổng SOCKS chỉ ra bên trung gian; sshConfig.host và port chỉ ra dịch vụ SSH cuối cùng.
Ví dụ dùng một điểm cuối SOCKS không có xác thực. Với máy chủ SSH truy cập được từ internet công cộng, danh sách proxy SOCKS5 có thể cung cấp ứng viên; mỗi ứng viên vẫn phải cho phép đích và cổng SSH. Với phương thức tên người dùng/mật khẩu, dùng socks.auth.UserPassword(proxyUser, proxyPassword) trong auths. Những thông tin đăng nhập đó không thay thế tài khoản SSH.
localDNS false chuyển tên máy chủ đích cho máy chủ SOCKS, dùng phân giải đích phía proxy. Không có lựa chọn rõ ràng đó, giá trị mặc định được tài liệu hóa của socksv5 sẽ thử phân giải cục bộ.
Callback SOCKS chạy sau khi thương lượng. Hãy chờ sự kiện ready của ssh2 trước khi yêu cầu SFTP. Đây là những giai đoạn thành công riêng biệt; cả kết nối TCP tới proxy lẫn phản hồi SOCKS đều không chứng minh xác thực SSH hay hệ thống con SFTP đã thành công.