在印象中,使用window server服务器的工作模式都是,本地项目打包,然后远程window服务器,手动复制生成环境下的项目文件到对应的服务器文件夹下,然后,在飞速发展的今天,自动化操作已经成为日常工作中的主流,这里给还在用window serverd的伙伴提供一种自动化解决方案,该方案本站点也正在使用。
window当然不像Linux那样,可以直接通过ssh传输,可以直接远程操作服务器执行shell命令来操作服务器,由于大部分旧版本的window server系统没有内置SSH服务,所以需要借助这个工具包Win32-OpenSSH,下载解压并进入到C:\Program Files\OpenSSH-Win64
,在当前目录执行命令powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1
安装SSH服务。
服务端
设置服务自动启动并启动服务:
1 2
| sc config sshd start= auto net start sshd
|
会生成目录和配置文件:C:\ProgramData\ssh C:\Users\账户名\.ssh
(这两个是隐藏文件)
这里SSH服务的用户是基于window的系统用户。
客户端
win10系统是自带SSH服务的,可以在应用和功能的可选功能中添加OpenSSH服务。
登录SSH服务:
1
| ssh administrator@your_server_ip
|
报错:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
这里C:\Users\Administrator\.ssh
去除当前登录IP的记录。
退出:
Node项目部署:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| const fs = require('fs') const path = require('path') const {NodeSSH} = require('node-ssh')
const ssh = new NodeSSH()
const config = { host: 'xxx.xxx.xxx.xxx', username: 'administrator', password: 'xxx', localDir: './build', remoteDir: '/Project/testPro/mockProject', command: 'cd C:/Project/testPro && rmdir mockProject /s/q && mkdir mockProject' }
function clearCache(){ return new Promise((resolve, reject) => { ssh.execCommand(config.command).then(function(result) { if(result.stderr) { reject(result.stderr) } else { resolve({code: 1}) } }) }) }
function uploadDir() { return new Promise((resolve, reject) => { ssh.putDirectory(config.localDir, config.remoteDir).then(function(){ resolve({code: 1}) }, function(error){ reject(error) }) }) }
ssh.connect({ ...config, port: 22, tryKeyboard: true, onKeyboardInteractive: (name, instructions, instructionsLang, prompts, finish) => { if (prompts.length > 0 && prompts[0].prompt.toLowerCase().includes('password')) { finish([config.password]) } } }) .then(async function() { console.log('connect success!') console.log('cache clearing...') const clearRes = await clearCache()
if(clearRes['code'] === 1) { console.log('clear success!') console.log('uploading...') const uploadRes = await uploadDir() if(uploadRes['code'] === 1) { console.log('upload success!') process.exit(1) } else { console.log('Error:', uploadRes) process.exit(0) } } else { console.log('Error:', clearRes) process.exit(0) } })
|
当然,这里也可以按照Linux系统一样上传压缩文件解压处理,不过得借助unzip工具包, 安装后将bin目录下的unzip.exe文件放在C:\Windows目录下,就可以执行unzip命令了。