import SftpClient from 'ssh2-sftp-client'; import path from 'path'; import fs from 'fs/promises'; // 使用 fs 的 Promise 版本 import { fileURLToPath } from 'url'; // 如果使用环境变量,取消下面这行的注释 // require('dotenv').config(); // 获取当前模块的文件路径 const __filename = fileURLToPath(import.meta.url); // 获取当前模块所在的目录路径 const __dirname = path.dirname(__filename); const config = { // 如果使用环境变量 // host: process.env.SFTP_HOST, // port: parseInt(process.env.SFTP_PORT) || 22, // username: process.env.SFTP_USER, // password: process.env.SFTP_PASS, // 直接配置 host: '36.103.203.89', port: 22, username: 'liuyang', password: 'Asdf!234', // 或者使用私钥认证 // privateKey: fs.readFileSync('/path/to/your/key') }; // 本地打包目录 const localDir = path.join(__dirname, 'dist'); // 服务器目标目录 // const remoteDir = process.env.SFTP_REMOTE_DIR; // 如果使用环境变量 const remoteDir = '/home/ubuntu/mnt/teacher_test/nginx-1/dist'; async function uploadToServer() { const sftp = new SftpClient(); try { console.log('开始连接服务器...'); await sftp.connect(config); console.log('连接成功,检查远程目录是否存在...'); const exists = await sftp.exists(remoteDir); if (exists) { console.log('清空远程目录中的内容...'); // 获取远程目录中的所有文件和文件夹 const remoteList = await sftp.list(remoteDir); // 依次删除每个文件和文件夹 for (const item of remoteList) { const remotePath = `${remoteDir}/${item.name}`; if (item.type === 'd') { // 如果是目录,递归删除 await sftp.rmdir(remotePath, true); } else { // 如果是文件,直接删除 await sftp.delete(remotePath); } } } else { console.log('远程目录不存在,创建目录...'); await sftp.mkdir(remoteDir, true); } console.log('开始上传文件...'); await sftp.uploadDir(localDir, remoteDir); console.log('文件上传完成!'); return true; } catch (err) { console.error('上传过程中发生错误:', err); return false; } finally { sftp.end(); } } uploadToServer();