开源地址:https://github.com/mscdex/ssh2
ssh2
是一个功能强大的 Node.js 库,用于通过 SSH 协议与远程服务器交互。它支持命令执行、文件上传下载、端口转发等操作,常用于自动化脚本和远程服务器管理。
下面是 ssh2
的详细使用步骤和常用方法介绍。
一、安装
首先,安装 ssh2
模块:
npm install ssh2
二、基本使用步骤
1. 导入模块
const { Client } = require('ssh2');
2. 建立连接
const conn = new Client();conn.on('ready', () => {console.log('SSH Connection Ready');// 可以在这里执行命令、上传文件等}).on('error', (err) => {console.error('Connection Error:', err);}).on('close', () => {console.log('Connection Closed');}).connect({host: 'your-server-ip',port: 22, // SSH 默认端口username: 'your-username',password: 'your-password', // 或使用 privateKey});
三、常用方法
1. 远程命令执行 (exec
)
用于在远程服务器上运行命令。
conn.exec('ls -l', (err, stream) => {if (err) throw err;stream.on('close', (code, signal) => {console.log(`命令执行完毕: 退出码 ${code}, 信号 ${signal}`);conn.end(); // 关闭连接}).on('data', (data) => {console.log('STDOUT:', data.toString());}).stderr.on('data', (data) => {console.error('STDERR:', data.toString());});
});
2. 上传文件 (sftp
)
通过 SFTP 上传文件到远程服务器。
conn.sftp((err, sftp) => {if (err) throw err;const localFile = './local-file.txt';const remoteFile = '/path/to/remote-file.txt';sftp.fastPut(localFile, remoteFile, {}, (err) => {if (err) {console.error('上传失败:', err);} else {console.log('文件上传成功');}conn.end();});
});
3. 下载文件 (sftp
)
通过 SFTP 下载文件到本地。
conn.sftp((err, sftp) => {if (err) throw err;const remoteFile = '/path/to/remote-file.txt';const localFile = './local-file.txt';sftp.fastGet(remoteFile, localFile, {}, (err) => {if (err) {console.error('下载失败:', err);} else {console.log('文件下载成功');}conn.end();});
});
4. 获取远程目录内容 (sftp
)
列出远程目录中的文件和子目录。
conn.sftp((err, sftp) => {if (err) throw err;const remoteDir = '/path/to/remote-dir';sftp.readdir(remoteDir, (err, list) => {if (err) {console.error('读取目录失败:', err);} else {console.log('目录内容:', list);}conn.end();});
});
5. 端口转发 (forwardIn
)
将远程服务器的端口映射到本地,适用于开发和调试。
conn.on('ready', () => {conn.forwardIn('127.0.0.1', 8000, (err) => {if (err) throw err;console.log('端口转发成功: 远程 127.0.0.1:8000');});
}).connect({host: 'your-server-ip',port: 22,username: 'your-username',password: 'your-password',
});
6. 转发本地端口到远程 (forwardOut
)
将本地端口数据通过 SSH 通道转发到远程服务器。
conn.on('ready', () => {conn.forwardOut('127.0.0.1', 8000, 'remote-server-ip', 9000, (err, stream) => {if (err) throw err;stream.write('Hello Remote Server');stream.end();});
}).connect({host: 'your-server-ip',port: 22,username: 'your-username',password: 'your-password',
});
7. 使用私钥认证
通过私钥进行连接。
conn.connect({host: 'your-server-ip',port: 22,username: 'your-username',privateKey: require('fs').readFileSync('/path/to/private-key'),
});
8. 动态代理 (createStream
)
通过 ssh2
创建 SOCKS 代理,常用于科学上网。
const socks = require('socksv5');conn.on('ready', () => {console.log('SSH ready for SOCKS proxy');socks.createServer((info, accept, deny) => {conn.forwardOut(info.srcAddr, info.srcPort, info.dstAddr, info.dstPort, (err, stream) => {if (err) {deny();return;}const clientSocket = accept(true);stream.pipe(clientSocket).pipe(stream);});}).listen(1080, '127.0.0.1', () => {console.log('SOCKS proxy listening on 127.0.0.1:1080');});}).connect({host: 'your-server-ip',port: 22,username: 'your-username',password: 'your-password',});
四、常见问题
-
连接失败:
- 检查
host
和port
是否正确。 - 确保远程服务器启用了 SSH 服务。
- 检查
-
权限问题:
- 确保 SSH 用户有足够的权限,必要时使用
sudo
(参考之前提到的-S
方法)。
- 确保 SSH 用户有足够的权限,必要时使用
-
性能优化:
- 使用 SFTP 的
fastPut
和fastGet
替代普通put
和get
。 - 批量处理文件时,考虑异步调用。
- 使用 SFTP 的
官方文档
更多方法和参数详见 ssh2 官方文档。