最近工作中总是需要传文件到linux服务器和局域网的一台windows电脑,总会觉得太繁琐了,因为每次都需要连接打开ftp客户端或者使用finder连接到局域网的windows主机,所以就想能不能使用脚本来完成这个工作。
环境
MacOS 12.6 node 14.18.0
安装scp2
npm i scp2 ora -S
ora是为了执行脚本的时候添加loading效果
传文件到linux服务器
传到linux服务器的过程是比较顺利的,这里直接贴代码
// 由于最新的ora包只能用import的方式引入所以这里用了异步函数
(async function () {
const { default: ora } = await import("ora");
const scpClient = require("scp2");
const path = require("path");
const fs = require("fs");
const server = {
host: "x.x.x.x", // 目标服务器或主机IP
port: 22, //目标服务器或主机端口 一般默认22 看情况
username: "uername", //ssh登录用户名
password: "pawword", //ssh登录密码
path: "", //目标服务器或主机目录
// debug: console.log // 可以打印scp2的日志 方便调试
};
const distDirectory = "localdir"; // 本地要上传的文件所在文件夹
const checkFiles = ["xxx.txt", "xxx.js"]; // 这里因为我想当localdir中只包含"xxx.txt", "xxx.js"的时候才执行上传 如果不想校验数组设置为空数组
const loadingColors = [
"black",
"red",
"green",
"yellow",
"blue",
"magenta",
"cyan",
"white",
"gray",
];
/**
* 当前路径是否为目录
* @param path
* @returns
*/
function isDirectory(path) {
return fs.statSync(path).isDirectory();
}
/**
* 校验localdir是否符合要求
* @returns
*/
function checkDist() {
const distPath = path.resolve(__dirname, distDirectory);
if (!isDirectory(distPath)) {
return false;
}
const files = fs.readdirSync(distPath);
console.log("\r该目录文件:", files);
console.log("校验文件:", checkFiles);
if (!checkFiles.length) {
return true;
}
if (files.length !== checkFiles.length) {
return false;
}
return files.every((file) => checkFiles.includes(file));
}
let loading = ora("正在校验文件...");
loading.start();
const checkResult = checkDist();
loading.stop();
console.log(checkResult ? "文件校验通过" : "文件校验失败");
if (!checkResult) {
process.exit();
}
loading = ora("正在部署至 " + server.host);
let counter = 0;
setInterval(() => {
counter++;
loading.color = loadingColors[Date.now() % loadingColors.length];
}, 1000);
loading.start();
scpClient.scp(distDirectory, server, (err) => {
loading.stop();
if (err) {
console.log("部署失败");
throw err;
} else {
console.log("部署成功");
process.exit();
}
});
})();
运行截图
传文件到windows
其他的ftp服务器应该也可以用,当然我猜的,这里使用的是Bitvise SSH Server,基本上算是傻瓜安装
windows上需要下载安装Bitvise SSH Server 官网没找到历史版本在哪下 我用的5.60
-
选中accept安装,不选中的话也没办法安装
-
选中standard edition 白嫖万岁
-
期间会自动打开命令行工具执行安装命令,安装完成之后会有弹窗提醒
-
然后选择manage host keys.
-
点击生成key
-
选中ssh-rsa, 点击generate
-
选中刚刚生成的key然后点击employ,然后点击close
-
点击open easy setting
-
配置端口,防火墙这里为了测试方便直接选择any computer,生产环境莫用
-
切换到virtual accounts选项卡,然后点击add添加虚拟账号
-
输入账号名,然后设置账号密码,这个页面都打上勾
-
关掉窗口,保存配置
-
然后开启服务
-
随后就可以使用linux那边的代码 尝试传文件过来,连接或者传文件成功,当前windows主机会收到提醒
注意事项
- 首次安装Bitvise SSH Server的时候并没有执行4-7步生成rsa加密的key,然后执行传文件的代码的时候报错了,调试发现是加密方式报的错。
- 代码仅在mac上测试