const { Client } = require('ssh2'); const fs = require('fs'); const path = require('path'); const conn = new Client(); const localDir = path.join(__dirname, 'dist', 'build', 'h5'); const remoteDir = '/www/huishou/dist/build/h5'; let uploadedCount = 0; function uploadDir(sftp, local, remote, cb) { fs.readdir(local, { withFileTypes: true }, (err, entries) => { if (err) { cb(err); return; } let done = 0, hasErr = false; if (entries.length === 0) { cb(null); return; } entries.forEach(e => { const lp = path.join(local, e.name); const rp = remote + '/' + e.name; if (e.isDirectory()) { sftp.mkdir(rp, { recursive: true }, (me) => { if (me && me.code !== 4) console.log('mkdir err:', me); uploadDir(sftp, lp, rp, (de) => { if (de) { hasErr = true; cb(de); } if (++done === entries.length && !hasErr) cb(null); }); }); } else { fs.readFile(lp, (re, content) => { if (re) { hasErr = true; cb(re); return; } sftp.createWriteStream(rp).on('close', () => { uploadedCount++; console.log('上传:', rp); if (++done === entries.length && !hasErr) cb(null); }).on('error', (we) => { hasErr = true; cb(we); }).end(content); }); } }); }); } conn.on('ready', () => { console.log('连接成功,开始清理旧文件...'); conn.exec(`rm -rf ${remoteDir}/*`, (err) => { if (err) { console.log('清理失败:', err); conn.end(); return; } console.log('旧文件已清理,开始上传...'); conn.sftp((err, sftp) => { if (err) { console.log('SFTP err:', err); conn.end(); return; } uploadDir(sftp, localDir, remoteDir, (err2) => { if (err2) { console.log('上传失败:', err2); } else { console.log(`上传完成!共上传 ${uploadedCount} 个文件`); conn.exec('/www/server/nginx/sbin/nginx -s reload', () => { console.log('Nginx已重启'); sftp.end(); conn.end(); }); } }); }); }); }); conn.connect({ host: '101.200.232.171', port: 22, username: 'root', password: 'Torch1112' });