Windows环境下使用脚本执行远程Linux服务器指令
Windows环境下使用脚本执行远程Linux服务器指令
1. 背景
由于平时开发环境是 Windows 系统上,但是通常一些程序部署在 Linux 系统上,如果需要在自己电脑上去更新 Linux 服务器上的程序之类的话会比较繁琐。典型的步骤如下:
- 打包程序。
- 上传程序到服务器。
- 备份旧的服务器程序版本。
- 解压新的程序包。
- 重启程序。
- 检验程序是否部署成功。
可以看出来,上面的步骤是每次更新程序都固定的一些步骤,如果能有批处理脚本可以一键来执行这些流程的话,对我们双手将会是极大的解放。由此我们可以想到,Windows 系统上肯定也有类似的脚本语言可以供我们使用。这里我使用的是 Bat 脚本,更简单一点。
注意:这里的场景是个人电脑+个人服务器,企业里一般可以使用如 Jenkins 工具来处理这些问题。
2. Windows 环境生成密钥对
如果需要脚本去连接 Linux 服务器的话,肯定是需要解决登录认证的问题,不可能每次我们都手动输入账号密码。 这里我们可以在客户端跟服务端使用公私钥去认证。简单的说就是在 Windows 系统生成 SSH 密钥,然后将 Windows 系统的公钥添加到 Linux 系统中,这样 Windows 系统通过公钥对应的私钥进行通信时,可以不用输入密码。
打开 Windows 命令行工具,输入如下指令后回车:
ssh-keygen
回车后将会询问如下问题:
- 密钥文件存储位置
- 密钥密码
- 重复密钥密钥
我们这里直接一直按回车后即可,最终看到出现如下图内容即为生成成功。
C:\Users\xxx>ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\xxx/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\xxx/.ssh/id_rsa
Your public key has been saved in C:\Users\xxx/.ssh/id_rsa.pub
The key fingerprint is:
SHA256: xxxxxx
The key's randomart image is:
+---[RSA 3072]----+
| .*+ . |
| .o. . |
| . . |
|. . o . |
|o.. . S . |
|o=+.... |
|+++=oE +. . |
|o+BoB.=+oo |
|+O.=oB+.o.. |
+----[SHA256]-----+
默认生成的密钥文件位置是:C:\Users\xxx/.ssh 目录下, 其中 xxx 为当前的系统用户名。文件夹下的文件如下:
C:\Users\xxx/.ssh
- id_rsa // 私钥文件
- id_rsa.pub // 公钥文件
- known_hosts
3. 配置 Windows 公钥到 Linux 系统上
使用对应的用户登录到 Linux 系统上。
创建一个名为
.ssh
的目录在当前用户目录下
mkdir -p ~/.ssh
chmod 700 ~/.ssh // 确保权限是这个
- 编辑或创建一个名为
authorized_keys
的文件,如果之前已经有了该文件则直接编辑即可
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
- 将 Windows 公钥配置到 authorized_keys 文件中。(即 id_rsa.pub 中的内容,不要复制错了)
上面的步骤操作完成后,你在 Windows 命令行中直接执行:
ssh root@你的服务器IP -i 你的私钥文件名
如果没有出现输入密码的环节,则说明公钥配置成功。
4. 在 Windows 上下载PuTTY
我们在 Windows 电脑上需要有对应的命令行工具可以连接服务器、上传文件等,这里我们选择使用 PuTTY 这个工具。
官网地址:https://www.chiark.greenend.org.uk/~sgtatham/putty/
摘自官网简介 :
PuTTY is a free implementation of SSH and Telnet for Windows and Unix platforms, along with an
xterm
terminal emulator. It is written and maintained primarily by Simon Tatham.
工具包含功能如下:
- PuTTY (Telnet 和 SSH 客户端)
- PSCP (命令行下通过 SSH 拷贝文件)
- Plink (命令行工具,执行远程服务器上的命令,这个功能很重要)
- Pageant (这里一个代理工具,如果要免密码登录需要用到。)
- PuTTYgen (生成密钥对的工具)
上面的这个工具覆盖了我们需要的功能点。下载完后直接一路下一步下一步即可。
5. 转换密钥文件为 PuTTY 的密钥文件
PuTTY和它的工具集(包括 plink.exe
和 pscp.exe
)默认使用自己的私钥格式,即 .ppk
格式。如果你的私钥是 OpenSSH 格式,需要先将其转换为 .ppk
格式。
转换步骤如下:
- 打开 PuTTYgen。
- 点击 “Load” 按钮选择
.ssh/id_rsa
私钥文件。 - 在文件选择对话框中,显示所有文件类型(这里很重要,因为 id_rsa 文件是没有后缀名的 ),选择您的
id_rsa
文件。 - 输入你的私钥密码(这里我们没有设置密钥,直接跳过即可)。
- 点击 “Save private key” 按钮保存为
.ppk
格式,你可以选择一个新的文件名,比如id_rsa.ppk
。我这里还是选择保存到 .ssh 文件夹中。
6. 编写响应的 Bat 脚本
新建一个 Batch-Process.bat
文件,样例文件内容如下:
@echo off
SET LOCALFOLDER= E:\source\ // 本地需要打包的目录
SET SERVERUSER=root // 登录用户名
SET SERVERHOST= // 服务器IP,不用端口
SET SERVERPATH= /home/deploy/ // 远端服务器路径
SET PRIVATEKEY= // ppk 文件路径
// 1. 打包本地的文件夹 E:\source\ 为 source.zip
echo Pack local folder...
"C:\Program Files\7-Zip\7z.exe" a -r -tzip "%LOCALFOLDER%\source.zip" "%LOCALFOLDER%\*" -mx=9
// 2. 上传本地文件夹的 source.zip 到服务器的 /home/deploy/ 目录下
echo Upload archive to server...
pscp.exe -i "%PRIVATEKEY%" "%LOCALFOLDER%\source.zip" "%SERVERUSER%@%SERVERHOST%:%SERVERPATH%"
// 3. 执行远端服务器指令,可以将里面的指令替换为你要执行的指令集合
echo Execute commands on server...
plink.exe -i "%PRIVATEKEY%" "%SERVERUSER%@%SERVERHOST%" "cd /home/deploy/ && unzip source.zip "
echo Done.
保存文件之后,双击即可运行脚本。 可以将上面脚本的内容改成你实际的场景需求,这样我们就实现了 Windows 环境下一键打包部署到 Linux 服务器。