使用Windows Terminal远程连接Linux服务器,并使用ssh秘钥实现免密连接

以前一直使用xshell、putty等客户端在Windows上远程连接Linux服务器,现在统统可以卸载了,因为现在使用Windows Terminal即可流畅实现这些功能。

1.安装Windows Terminal

单击左下角“开始”,选择“Microsoft Store”,搜索“Windows Terminal”,进行安装。

2.安装OpenSSH客户端

“设置”“应用”中点击“可选功能”,查看电脑上是否已安装“OpenSSH客户端”,如果下图界面中没有“OpenSSH客户端”,点击“添加功能”选项进行添加。

安装OpenSSH客户端

3.设置ssh登录配置文件

打开Windows Terminal,可以发现其跟cmd命令窗口、shell都很像,其实在这里就可以把它当成上述二者使用。在这里直接执行ssh命令:

即可实现远程访问服务器。其中 -p 22 是指定22号端口,user 是指登录用户名,@后面的是服务器 ip 。
但是这种访问方式需要每次都输入服务器ip和用户名、用户密码等信息,使用体验非常不友好。如何一劳永逸不用输入这些信息就能直接连接远程服务器呢?

首先,单击Windows Terminal窗口上方的下三角,在下拉菜单中选择设置,就会打开Windows Terminal的配置文件。

打开配置文件

打开后的json配置文件中的核心代码如下:

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
"profiles":
    {
        "defaults":    
        {
            // Put settings here that you want to apply to all profiles.
        },
        "list":
        [
            {
                // Make changes here to the powershell.exe profile.
                "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
                "name": "Windows PowerShell",
                "commandline": "powershell.exe",
                "hidden": false
            },
            {
                // Make changes here to the cmd.exe profile.
                "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
                "name": "命令提示符",
                "commandline": "cmd.exe",
                "hidden": false
            },
            {
                "guid": "{b453ae62-4e3d-5e58-b989-0a998ec441b8}",
                "hidden": false,
                "name": "Azure Cloud Shell",
                "source": "Windows.Terminal.Azure"
            }
        ]
    },

上面的json文件中"list"项有3条用花括号括起来的内容,分别是"Windows PowerShell"“cmd”“Azure Cloud Shell”的配置内容。这3项正是Windows Terminal窗口的下三角下拉菜单中的选项。

下拉菜单

可以看出,我的截图中还有一个“Ubuntu”的企鹅选项,不难猜测,想要在下拉菜单中增加新的选项,只需要并列地添加新选项的配置文档就可以了。下面给出我的配置文件中添加的内容,并做相应的解释。
【注意】:下面的代码块为在配置文件中添加的内容,添加的位置为上面代码块中的中括号内,和其它3个花括号形成并列关系,并注意添加逗号分隔符!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
            {
                "acrylicOpacity" : 0.5,
                "closeOnExit" : true,
                "commandline" : "ssh -p 22 [email protected]",  
                "cursorColor" : "#FFFFFF",
                "cursorShape" : "bar",
                "fontFace" : "Consolas",
                "fontSize" : 14,
                "guid" : "{20c1b201-1272-4bb0-b008-6eb5fed2cb2f}",
                "historySize" : 9001,
                "name" : "Ubuntu",
                "icon": "C:\\Users\\pxt\\Pictures\\linux.jpg",
                "padding" : "0, 0, 0, 0",
                "snapOnInput" : true,
                "startingDirectory" : "",
                "useAcrylic" : false
             }

其中重点介绍几个选项:

"commandline" : "ssh -p 22 [email protected]"

单击该选项时执行的命令。即把该选项添加到下拉菜单后,点击该选项就相当于执行命令"ssh -p 22 [email protected]"。

"guid" : "{20c1b201-1272-4bb0-b008-6eb5fed2cb2f}"

相当于该profile的id,可自己执行命令:

1
new-guid

获得新的guid序列号。如果想要将某个选项设置为打开窗口时默认的profile,就在配置文件中的"defaults"项内将"guid"的值设置为相应选项的guid值即可。

"name" : "Ubuntu"

新添加选项的名字,会显示在下拉选项中,比如我的是“Ubuntu”。

"icon": "C:\Users\pxt\Pictures\linux.jpg"

下拉选项中的图标,比如我的是个小企鹅,这个图像就存放在本地"C:\Users\pxt\Pictures\linux.jpg"路径下。
其它都是一些字体、颜色等属性的设置,无关紧要,这里不做解释。

保存配置文件后重新启动Windows Terminal窗口,在下三角下拉菜单中即可看到出现的“Ubuntu”选项。点击该选项,就会自动新建终端并已执行完ssh命令,你只需要输入密码就可以连接远程服务器了。

4.ssh秘钥登录

每次登录时都要输入密码也很麻烦,可以连输入密码操作也自动执行吗?答案是肯定的。从上面的分析中可以看出,当我们点击下拉菜单中的某个选项时,新建的窗口是怎么执行命令的,主要靠配置文件中该选项的"commandline"。使用ssh命令的-i选项,即可无需输入密码,使用指定的ssh秘钥登录。
将Ubuntu选项配置文件中的"commandline"修改为:

1
"commandline" : "ssh -i D:\\id_rsa [email protected]"

【注意】:将路径、用户名及ip修改为自己的对应内容!!!
其中的“D:\id_rsa”为服务器的ssh秘钥。获得秘钥的方法如下:

(1)在服务器端生成秘钥

在服务器端的shell中执行命令:

1
ssh-keygen

一直按Enter键,将在“~/.ssh/”路径下生成公钥私钥

1
2
a415@a415:~/.ssh$ ls
id_rsa  id_rsa.pub  known_hosts

该路径下的文件“id_rsa”是私钥“id_rsa.pub”是公钥保证公钥在服务器端,私钥在本地端,就可以在本地端使用私钥进行免密登录远程服务器。

在服务器端键入以下命令,在服务器上安装公钥:

1
2
cd .ssh
cat id_rsa.pub >> authorized_keys

如此便完成了公钥的安装。为了确保连接成功,请保证以下文件权限正确:

1
2
chmod 600 authorized_keys
chmod 700 ~/.ssh

(2)将私钥拷贝至本地Windows系统磁盘下

在本地端Windows Powershell下执行命令:

1
scp [email protected]:/home/a415/.ssh/id_rsa D:\\

将服务器端的私钥拷贝到本地D盘下。
【注意】:将用户名、服务器ip以及路径修改为自己的相应内容!!!

(3)对秘钥文件的权限进行修改

将id_rsa文件直接拷贝到本地,修改Windows Terminal的配置文件中的"commandline"后,会报错,出现权限问题。因此按以下步骤对该文件的权限进行修改。

1.选中拷贝至D盘下的id_rsa文件,右键→属性→安全→高级

image.png

2.点击左下角“禁用继承”,并在弹出的窗口中选择下面的“从此对象中删除所有已继承的权限”

image.png

3.点击左下角的“添加”

image.png

4.在弹出的窗口中选择左上角的“选择主体”,并在弹出的小窗口的“输入要选择的对象名称”一栏输入windows系统的用户名。比如我的用户名是pxt。如果不知道用户名的话可以再“C:\用户\”路径下查看用户名。

image.png

5.输入用户名后,点击右侧的“检查名称”按钮,系统会自动校正与输入的用户名关联的具体对象名称:

image.png

分别点击各窗口的“确定”按钮关闭窗口即可。

(4)修该配置文件

此时打开Windows Terminal的配置文件,在添加的"Ubuntu" profile中,修改"commandline"一行的信息为:

1
"commandline" : "ssh -i D:\\id_rsa [email protected]"

保存配置文件后关闭。重启Windows Terminal后在下拉菜单中选择Ubuntu选项,即可自动连接服务器端,无需任何操作。