0%

使用Windows Terminal来进行ssh


概述

之前一直使用xshell来进行ssh的管理,最近由于一些问题,不便再使用xshell,所以这里尝试换用Windows Terminal来进行ssh的管理。

这里使用以下元素:

  • Windows Terminal:ssh管理。
  • ssh config:配置各个host的登录选项。
  • ssh-agent: 私钥管理。

实现方便的ssh免密登录。


安装Windows Terminal

Microsoft Store中搜索安装即可,这一步很简单,网上的教程也很多。


安装Openssh Server

直接搜索可选功能

image

打开,然后添加Openssh:

image

一般情况windows已经安装好了client,安装一下server就行。


启动ssh-agent

为了不用在ssh config中指定每个host的私钥,所以这里选择使用ssh-agent来进行私钥管理。

windows默认是不启动这个服务的,需要手动开启:

image

直接搜索服务然后打开,

image

找到OpenSSH Authentication Agent,设置为自动,并启动它。


生成ssh密钥

首先先看看自己是不是已经生成过了密钥,位于用户目录~/.ssh下,例如我的密钥生成在C:\Users\龙\.ssh下,有id_rsaid_rsa.pub两个文件,就代表已经生成了密钥,当然重新生成也可以。

如果没有,那就要手动生成一下。打开Windows terminal,输入命令,

1
2
// 使用自己的邮箱
ssh-keygen -t rsa -C "[email protected]"

然后一路回车就完事:

image

然后就可以在用户目录下发现生成的私钥与公钥:

image


添加私钥到ssh-agent

ssh-agent能对多个私钥进行自动管理,但是首先还是需要手动把私钥添加进去,直接使用ssh-add

1
PS C:\Users\龙> ssh-add .\.ssh\id_rsa

使用ssh-add -l可以看到现在添加了哪些私钥。


配置ssh config文件

如果不配置config文件,那么每次都需要输入一大段命令,挺麻烦的,配置config文件,可以简化很多操作。

来到ssh目录~/.ssh下,新创建一个文件config,修改文件内容进行配置,例如我这里配置如下:

1
2
3
4
5
6
Host *
ForwardAgent yes
Host aly1
Hostname 123.123.123.123
Port 22
User root

其中:

  • Host:就表示你为这个配置的命名,支持通配符。
  • ForwardAgent:表示是否使用ssh-agent来转发密钥。
  • Hostname:远程地址。
  • Port:远程端口。
  • User:登录用户名。

这里使用了*通配,来表示所有Host都使用ssh-agent来转发密钥,配置了远程地址aly1。然后就可以在Windows terminal中使用ssh aly1来进行登录:

image

我这里已经拷贝了公钥过去,所以不需要输入密码,正常情况这里还是需要输入密码。


拷贝公钥到远程主机

为了实现免密登录,可以把公钥拷贝到远程主机。

首先把id_rsa.pub文件拷贝过去,使用scp命令:

1
PS C:\Users\龙> scp .\.ssh\id_rsa.pub aly1:~/

这样就拷贝到了远程主机的~目录下。

登录到远程主机,同样的,远程主机的~目录下也应该有.ssh文件夹(如果没有则创建一个),然后将公钥导入到authorized_keys文件中:

1
[[email protected] ~]# cat id_rsa.pub >> .ssh/authorized_keys

这样就完成了公钥拷贝的过程,另外记得把拷贝到远程主机的id_rsa.pub文件删除掉(虽然没有任何影响)。

这样再次使用ssh aly1进行远程登录就不需要再输入密码了。

别的博客看了一下,可以使用更简单的命令来解决拷贝过程:

1
cat .\.ssh\id_rsa.pub | ssh aly1 'umask 0077; mkdir -p .ssh; cat >> .ssh/authorized_keys'

创建Windows Terminal选项卡

目前为止,我们已经可以很简单的使用ssh aly1这样的方式进行远程登录了,但是问题就是,如果有很多主机,显然aly1这样的名字已经很难对主机进行区分,很难记住我们当前需要登录的是aly1还是aly2。所以这里可以创建选项卡来解决这个问题。

打开设置:

image

打开json配置文件:

image

增加配置如下:

image

1
2
3
4
5
6
7
8
{
"guid": "{b453ae63-4e3d-5e58-b989-0a998ec441b8}",
"hidden": false,
"name": "1.1.1.1-aly1",
"tabTitle": "1.1.1.1-aly1",
"suppressApplicationTitle": true,
"commandline": "ssh aly1"
}
  • 这里guid复制的上面的,然后随便改了一个数字。
  • 选项卡命名name为1.1.1.1-aly1,增加ip在名字上来对主机进行区分。
  • 使用了suppressApplicationTitle字段,来让这个选项卡的名字保持为name。
  • commandline即此选项卡执行的命令,这里ssh aly1表示登录aly1

效果如下:

image

点击即可打开对应的远程链接:

image

到这里就基本满足使用需求,方便快捷。


如何通过跳板机登录内网机器

对于正式环境,登录内部机器通常都需要经过跳板机,这里有几种方法透过跳板机来登录到内网机器。

方法一:ProxyJump

在ssh的config文件中进行配置:

1
2
3
4
5
6
7
8
9
Host tbj
hostname 1.1.1.1
user lrm
port 22
Host target
hostname 192.168.0.100
user wjx
port 33
ProxyJump tbj

相当于指定target通过tbj来进行登录,这样就可以通过使用ssh target来进行登录。

方法二:ProxyCommand

在ssh的config文件中进行配置:

1
2
3
4
5
6
7
8
9
Host tbj
hostname 1.1.1.1
user lrm
port 22
Host target
hostname 192.168.0.100
user wjx
port 33
ProxyCommand ssh tbj -W %h:%p

和上面类似。

方法三:配置Windows Terminal选项卡

实际上,上面两个方法我经过尝试,都失败了…报错kex_exchange_identification: Connection closed by remote host。但是通过直接使用ssh命令可以成功登录:

1
ssh -t tbj ssh [email protected] -p 33

那么就可以把这个命令直接配置到Windows Terminal选项卡里面,

1
2
3
4
5
6
7
8
{
"guid": "{b453ae71-4e3d-5e58-b989-0a998ec441b8}",
"hidden": false,
"name": "192.168.0.100-target",
"tabTitle": "192.168.0.100-target",
"suppressApplicationTitle": true,
"commandline": "ssh -t tbj ssh [email protected] -p 33"
}

这样就可以直接透过跳板机登录到内网机器。