原文链接:
https://juejin.cn/post/7434560677908594739
SSH2-SFTP-Client:简化SFTP文件传输的Node.js插件
在现代开发环境中,文件传输是一个不可或缺的环节,特别是在需要在不同服务器之间同步数据或上传下载文件时。SSH(安全外壳协议)和SFTP(SSH文件传输协议)因其安全性和灵活性而广受欢迎。对于Node.js开发者来说,ssh2-sftp-client
是一个强大的插件,能够极大地简化SFTP操作。本文将详细介绍ssh2-sftp-client
的功能、安装方法以及如何使用它进行文件传输。
一、概述
ssh2-sftp-client
是一个基于ssh2
库的Node.js模块,它提供了一个高级的API,使得通过SFTP进行文件上传、下载、删除、列出等操作变得简单直观。该插件封装了底层的SFTP细节,开发者无需深入了解SFTP协议的具体实现,即可快速实现文件传输功能。
二、安装
要使用ssh2-sftp-client
,首先需要确保你的Node.js(版本>14,本人用的16)环境已经安装。然后,你可以通过npm(Node包管理器)来安装这个插件:
bash
代码解读
复制代码
npm install ssh2-sftp-client
三、基本用法
1. 导入模块
在你的Node.js文件中,首先导入ssh2-sftp-client
模块:
const SftpClient = require('ssh2-sftp-client');
2. 连接到SFTP服务器
使用connect
方法连接到SFTP服务器,需要提供主机名、端口号、用户名和密码等信息。连接成功后,你可以使用返回的连接对象进行各种文件操作。
const sftp = new SftpClient();
sftp.connect({
host: 'your.sftp.server',
port: '22',
username: 'your-username',
password: 'your-password'
}).then(() => {
console.log('Connected to SFTP server');
// 在这里进行文件操作
}).catch(err => {
console.error('Error connecting to SFTP server:', err);
});
3. 文件操作
上传文件
sftp.put('/local/path/to/file.txt', '/remote/path/to/file.txt')
.then(() => {
console.log('File uploaded successfully');
})
.catch(err => {
console.error('Error uploading file:', err);
});
下载文件
sftp.get('/remote/path/to/file.txt', '/local/path/to/file.txt')
.then(() => {
console.log('File downloaded successfully');
})
.catch(err => {
console.error('Error downloading file:', err);
});
列出目录内容
sftp.list('/remote/path')
.then(data => {
console.log('Directory contents:', data);
})
.catch(err => {
console.error('Error listing directory:', err);
});
删除文件
sftp.delete('/remote/path/to/file.txt')
.then(() => {
console.log('File deleted successfully');
})
.catch(err => {
console.error('Error deleting file:', err);
});
上传文件夹
sftp.uploadDir('本地目录','远程目录')
.then(() => {
console.log('File downloadDir successfully');
})
.catch(err => {
console.error('Error downloadDir file:', err);
});
下载服务器的文件夹
sftp.downloadDir('远程目录','本地目录')
.then(() => {
console.log('File downloadDir successfully');
})
.catch(err => {
console.error('Error downloadDir file:', err);
});
重命名服务器文件夹
sftp.rename('远程目录','远程新目录')
.then(() => {
console.log('File rename successfully');
})
.catch(err => {
console.error('Error rename file:', err);
});
4. 断开连接
完成所有文件操作后,别忘了断开与SFTP服务器的连接:
sftp.end()
.then(() => {
console.log('Disconnected from SFTP server');
})
.catch(err => {
console.error('Error disconnecting from SFTP server:', err);
});
四、实践
创建js文件
const SftpClient = require('ssh2-sftp-client')
const sftp = new SftpClient()
const config = {
host: 'ip',
port: '端口号',
username: '服务器账号',
password: '服务器密码' // 或者使用 privateKey 字段提供私钥路径
}
const remoteDir = '/database/nginx/html/TianJin/operation' // 远程目录路径
const newFolderPath = '/database/nginx/html/TianJin/operationBak1' // 重命名后的文件夹新路径(仅改变名称)
// const localDir = 'bak' // 本地保存路径
sftp.connect(config).then(() => {
console.log('连接成功!')
// console.log('开始下载目录...')
// return sftp.downloadDir(remoteDir, localDir) // 这里本意想下载到本地进行备份
console.log('开始备份文件夹...')
// return sftp.rename(remoteDir, newFolderPath) // 重命名文件夹(远程已经有的文件夹名称,会重命名错误)
}).then(() => {
// console.log('目录下载成功!')
console.log('文件夹备份成功!')
console.log('开始上传文件...')
sftp.uploadDir('operation', remoteDir).then(() => { //'operation'打包后的文件夹目录,这里js放在同级目录中所以,这里可以只填写文件夹名
console.log('文件上传成功!') //这里会直接将远程文件目录覆盖掉,所以前面可以加上备份操作
return sftp.end()
}).catch((err) => {
console.error(err.message)
if (sftp.sftp) {
sftp.sftp.end()
}
})
}).catch((err) => {
console.error(err.message)
if (sftp.sftp) {
sftp.sftp.end()
}
})
将js文件放入项目中,位置随意,然后在package.json中加入一行
执行脚本
npm run deploy
五、高级功能
ssh2-sftp-client
还支持许多高级功能,如使用SSH密钥进行身份验证、流式文件传输、处理大文件等。你可以查阅官方文档获取更多详细信息和示例代码。
六、总结
ssh2-sftp-client
是一个功能强大且易于使用的Node.js插件,它极大地简化了通过SFTP进行文件传输的复杂性。无论你是需要上传、下载、删除文件,还是列出目录内容,这个插件都能提供直观且高效的API。如果你正在开发需要文件传输功能的Node.js应用,不妨尝试一下ssh2-sftp-client
。