七的博客

Windows环境下使用脚本执行远程Linux服务器指令

WindowsLinux

Windows环境下使用脚本执行远程Linux服务器指令

1. 背景

由于平时开发环境是 Windows 系统上,但是通常一些程序部署在 Linux 系统上,如果需要在自己电脑上去更新 Linux 服务器上的程序之类的话会比较繁琐。典型的步骤如下:

  1. 打包程序。
  2. 上传程序到服务器。
  3. 备份旧的服务器程序版本。
  4. 解压新的程序包。
  5. 重启程序。
  6. 检验程序是否部署成功。

可以看出来,上面的步骤是每次更新程序都固定的一些步骤,如果能有批处理脚本可以一键来执行这些流程的话,对我们双手将会是极大的解放。由此我们可以想到,Windows 系统上肯定也有类似的脚本语言可以供我们使用。这里我使用的是 Bat 脚本,更简单一点。

注意:这里的场景是个人电脑+个人服务器,企业里一般可以使用如 Jenkins 工具来处理这些问题。

2. Windows 环境生成密钥对

​ 如果需要脚本去连接 Linux 服务器的话,肯定是需要解决登录认证的问题,不可能每次我们都手动输入账号密码。 这里我们可以在客户端跟服务端使用公私钥去认证。简单的说就是在 Windows 系统生成 SSH 密钥,然后将 Windows 系统的公钥添加到 Linux 系统中,这样 Windows 系统通过公钥对应的私钥进行通信时,可以不用输入密码。

打开 Windows 命令行工具,输入如下指令后回车:

ssh-keygen 

回车后将会询问如下问题:

  1. 密钥文件存储位置
  2. 密钥密码
  3. 重复密钥密钥

我们这里直接一直按回车后即可,最终看到出现如下图内容即为生成成功。

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.exepscp.exe)默认使用自己的私钥格式,即 .ppk 格式。如果你的私钥是 OpenSSH 格式,需要先将其转换为 .ppk 格式。

转换步骤如下:

  1. 打开 PuTTYgen。
  2. 点击 “Load” 按钮选择 .ssh/id_rsa 私钥文件。
  3. 在文件选择对话框中,显示所有文件类型(这里很重要,因为 id_rsa 文件是没有后缀名的 ),选择您的 id_rsa 文件。
  4. 输入你的私钥密码(这里我们没有设置密钥,直接跳过即可)。
  5. 点击 “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 服务器。