SSH 服务详解 (三)-- 使用 SSH 代理
SSH服务详解(一)–Linux SSH 服务器与客户端的安装与启动
SSH服务详解(二)–使用私钥登录 SSH 服务器(免密登录)
SSH服务详解(八)– vscode 通过 SSH 远程连接 linux 服务器
- SSH 服务器运行在 ubuntu 18.04.1
- SSH 客户端在 Windows10
上一小节中使用命令
ssh -i .\id_rsa tyustli@192.168.10.18
可以使用 SSH 远程连接到 SSH 服务器,但是每次都需要指定秘钥,本小节就梳理一下 SSH 代理相关的知识,有了 SSH 代理之后就不需要自己每次手动输入秘钥了
SSH 代理使用步骤
- 启动 SSH 代理程序
- 将对应私钥添加到 ssh 代理中,在添加私钥时,如果提示输入私钥的密码,正确的输入私钥密码即可将私钥添加到 ssh 代理中
- 连接到远程用户
- 私钥管理
SSH 代理介绍
ssh 代理是一个程序,它可以帮助我们管理私钥,ssh-agent 即为 ssh 代理程序
那么什么时候需要 ssh 代理帮助我们管理私钥呢?当遇到如下情况时,我们会需要 ssh 代理。
-
使用不同的密钥连接到不同的主机时,每次都需要手动指定对应的密钥,ssh 代理可以帮助我们选择对应的密钥进行认证,不用手动指定密钥即可进行连接
-
当私钥设置了密码,我们又需要频繁的使用私钥进行认证时,ssh 代理可以帮助我们免去重复的输入密码的操作
启动 SSH 代理
以管理员身份启动 powershell ,在 powershell 输入如下命令
ssh-agent
如果启动失败,会报错,例如错误
unable to start ssh-agent service, error :1058
设置 SSH 代理程序自动启动
Set-Service -Name ssh-agent -StartupType Automatic
StartupType 类型可以取如下参数
-
Automatic 2
指示服务将由(或已由)操作系统在系统启动时启动。 如果一个自动启动的服务依赖于手动启动的服务,则该手动启动的服务也会在系统启动时自动启动。 -
Boot 0
指示该服务是由系统加载程序启动的设备驱动程序。 此值仅对设备驱动程序有效。 -
Disabled 4
指示服务已禁用,因此无法由用户或应用程序启用。 -
Manual 3
指示服务仅由用户(使用服务控制管理器)或应用程序以手动方式启动。 -
System 1
指示该服务是由 IOInitSystem 函数启动的设备驱动程序。 此值仅对设备驱动程序有效。
上述命令设置 SSH 代理程序自动启动,再次在 powershell 命令行中输入 ssh-agent 命令即可启动 SSH 代理程序
启动之后查看 SSH 代理程序
ps
命令执行之后结果如下
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
...
80 7 1388 5688 0.02 26776 0 ssh-agent
609 32 31456 72296 6.03 6916 1 StartMenuExperienceHost
..
如果想关闭 SSH 代理程序,使用命令
kill 26776 // kill pid
询问是否关闭 SSH 代理程序
确认
是否确实要针对以下项执行 Stop-Process 操作: ssh-agent(26776)?
[Y] 是 (Y) [A] 全是 (A) [N] 否 (N) [L] 全否 (L) [S] 暂停 (S) [?] 帮助 (默认值为 “Y”): Y
输入 Y 即可
添加 SSH 私钥
私钥添加,将私钥交给 SSH 代理程序管理
ssh-add .\id_rsa
添加过程中会报错
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for '.\\id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
这里提示私钥文件文件添加失败,原因是太多用户可以访问这个私钥,该私钥被忽略。所以需要修改私钥文件的权限
在 Linux 中可以使用 chmod 命令,但是 Windows 并没有这个命令
在 windows 中对应的命令是 icacls
具体 icacls/cacls
的命令参数可以参看相关的帮助文档(powershell 直接输入命令即可查看命令帮助)
给系统用户读取权限
icacls .\id_rsa /c /t /grant system:R
禁用继承
icacls .\id_rsa /c /t /inheritance:r
给当前用户读取权限
icacls .\id_rsa /c /t /grant tyustli:R # tyustli 为当前用户名
上述命令均会有如下命令执行结果
已处理的文件: .\id_rsa
已成功处理 1 个文件; 处理 0 个文件时失败
还有一种错误是
invalid format
这是因为 Linux 和 windows 两种系统对换行的处理不一样,Liunx 中换行 \n
但是在 windows 中换行是 \r\n
文件权限修改完成之后再次输入
ssh-add .\id_rsa
提示 SSH 私钥添加成功
Identity added: .\id_rsa (.\id_rsa)
远程连接
私钥添加到 SSH 代理程序之后,直接连接即可
ssh tyustli@192.168.10.18
此时不需要指定私钥,也不需要输入登录密码即可直接连接(如果私钥有密码,需要输入私钥的密码)
退出连接
exit
私钥管理
查看私钥管理相关命令
ssh-add --help
-l List fingerprints of all identities.
-E hash Specify hash algorithm used for fingerprints.
-L List public key parameters of all identities.
-k Load only keys and not certificates.
-c Require confirmation to sign using identities
-t life Set lifetime (in seconds) when adding identities.
-d Delete identity.
-D Delete all identities.
-x Lock agent.
-X Unlock agent.
-s pkcs11 Add keys from PKCS#11 provider.
-e pkcs11 Remove keys provided by PKCS#11 provider.
-q Be quiet after a successful operation.