ssh使用
ssh介绍
ssh全称secure shell (安全外壳协议),是一种用于在不安全的网络环境中,为远程登陆和其他网络服务提供安全加密通信的网络协议^1。
工作原理
ssh采用非对称加密和对称加密结合的方式保证安全
身份验证阶段
服务器会提供公钥[^2],客户端验证服务器身份;同时客户端通过密码对(公私钥)完成身份认证,确认用户有权限登陆。
数据传输阶段
认证成功后,双方会协商生成一个临时的对称加密密钥,后续所有通信都通过该密钥加密,兼顾安全性和传输效率。
window中ssh的默认行为
默认连接端口
连接远程服务器是,默认使用22端口(行业标准),若远程服务器未修改ssh端口,执行ssh 用户@服务器ip命令即可省略端口参数。首次连接陌生服务器时,会提示验证服务器指纹并询问是否继续,输入yes后,服务器指纹会把保存到==C:\Users\你的用户名.ssh\known_hosts==文件,后续连接同一服务器不再验证
默认协议与加密
仅支持SSHV2协议,不兼容SSHv1;ssh-keygen命令生成密钥时,默认采用Ed25519算法,若未指定算法,生成的密钥文件名为id_ed25519私钥和id_ed25519.pub公钥、
默认shell环境
当通过ssh客户端连接到windows ssh服务器时,默认启动的命令行shell是cmd,而非powershell或其他终端。
身份认证相关默认行为
- 服务器公钥自动生成:Windows SSH 服务器启动时,会检查
%programdata%\ssh\目录下是否存在 ssh_host_rsa_key、ssh_host_ed25519_key 等主机密钥文件。若文件缺失,服务会自动生成这些密钥,用于向客户端验证服务器身份。 - 公钥认证文件路径:服务器端默认通过
%userprofile%\.ssh\authorized_keys文件验证客户端公钥。对于管理员账户,还会优先读取%programdata%\ssh\administrators_authorized_keys文件,以此控制管理员账户的 SSH 公钥登录权限。 - GSSAPI 认证默认关闭:GSSAPI(基于 Kerberos 的认证方式)默认配置为关闭状态(GSSAPIAuthentication no),默认优先采用密码认证或密钥认证方式。
服务与权限默认行为
- 服务启动与配置:SSH 服务器(sshd)默认读取
%programdata%\ssh\sshd_config配置文件,若该文件缺失,启动服务时会自动生成默认配置文件。且服务启动后修改配置文件,需重启 sshd 服务才能使新配置生效。 - 防火墙规则差异:Windows 10 中启用 SSH 服务器后,需手动配置防火墙规则放行 22 端口;而 Windows 11 会自动启用防火墙规则,允许 SSH 流量通过 22 端口。
- 权限限制:Windows 无 Linux 的 root 用户概念,默认不支持 PermitRootLogin 配置。若要禁止管理员登录,需通过 sshd_config 中的 DenyGroups 指令配置,而非修改 root 相关参数。同时,
authorized_keys等密钥文件默认会限制权限,仅当前用户可读写,避免其他账户篡改。
关联工具默认行为
- 辅助命令默认依赖:
scp(远程文件复制)、sftp(安全文件传输)工具默认基于 SSH 协议工作,无需额外配置,可直接使用,且默认沿用 SSH 的端口、密钥等配置,例如scp 本地文件 用户名@服务器IP:目标路径命令会默认通过 22 端口传输。 - 密钥代理默认状态:
ssh-agent工具默认未自动启动,需手动在 PowerShell 中执行Start-Service ssh-agent启动服务,之后通过ssh-add命令添加的私钥才会被缓存,实现临时免密登录,重启电脑后缓存会失效。
ssh-agent的使用
windows中ssh工具的操作逻辑
默认密钥位置
默认保存在当前用户目录下的.ssh 文件夹中,路径为C:\Users\你的用户名\.ssh\。
生成的密钥文件默认名为 id_rsa(私钥)和 id_rsa.pub(公钥),若选择 Ed25519 算法,文件名则为 id_ed25519 和 id_ed25519.pub。
默认config文件位置
分为用户级和系统级两类。用户级配置文件路径是C:\Users\你的用户名\.ssh\config;
系统级配置文件路径为%ProgramData%\ssh\ssh_config。
默认情况下用户级 config 文件可能不存在,需手动创建。
config文件读取方式
SSH 客户端读取配置有固定优先级,首先读取通过ssh.exe -f 配置文件路径指定的配置文件;若未指定,则读取用户级的~/.ssh/config;最后读取系统级的%ProgramData%\ssh\ssh_config,优先级依次降低,高优先级配置会覆盖低优先级配置
config的配置
编码方式为UTF-8
编辑规则
- 配置以
Host为核心分组,一个Host对应一个远程服务器的配置; - 每行格式为
参数名 参数值,参数名不区分大小写,但建议统一大写(规范); - 缩进仅为可读性,无语法要求;
#开头的行是注释,不会生效;- 配置优先级:
Host *(全局配置) < 具体Host(如Host work) < 命令行参数(如ssh -p 2222)。
核心配置参数以及作用
| 参数名 | 核心作用 | 示例 / 说明 |
|---|---|---|
Host |
自定义连接别名(核心标识) | Host work-server:后续执行ssh work-server即可连接,无需输完整 IP / 端口 |
HostName |
远程服务器的 IP 地址或域名 | HostName 192.168.1.100/HostName ssh.example.com |
User |
登录远程服务器的用户名 | User admin/User root |
Port |
远程服务器的 SSH 端口(默认 22) | Port 2222:连接非默认 22 端口的服务器 |
IdentityFile |
指定私钥文件路径(自定义密钥) | IdentityFile D:\ssh_keys\work_rsa:使用该路径的私钥登录,替代默认id_rsa |
ServerAliveInterval |
心跳包间隔(防止连接超时) | ServerAliveInterval 30:每 30 秒发送一次心跳包,保持连接不中断 |
ServerAliveCountMax |
心跳包失败次数上限 | ServerAliveCountMax 5:连续 5 次失败则断开连接(默认 3) |
ForwardAgent |
开启代理转发(多服务器免密) | ForwardAgent yes:本地私钥可转发到远程服务器,方便从远程连其他服务器 |
StrictHostKeyChecking |
控制服务器指纹验证 | StrictHostKeyChecking no:首次连接不提示验证指纹(方便脚本执行,慎用) |
UserKnownHostsFile |
自定义known_hosts文件路径 |
UserKnownHostsFile D:\ssh\my_known_hosts:替代默认的~/.ssh/known_hosts |
ProxyJump |
跳板机 / 代理服务器配置 | ProxyJump user@jump-server:22:先连跳板机,再连目标服务器(适用于内网服务器) |
例如git配置
1 | Host github.com |
具体使用实例
以客户端和git服务器连接为例
本地生成
生成密钥
ssh-keygen -t ed25519 -f C:\Users\18875\.ssh\自定义密钥名称
多密钥配置
在.ssh文件夹下的config中配置
Host github.com 本地主机名可以自定义与后面建立远程仓库连接有关
Hostname ssh.github.com ssh地址
Port 443 端口
User git
IdentityFile ~/.ssh/blog_M_key 自定义使用的私钥
测试连接
ssh -T git@config中的主机名
连接存放公钥的仓库
git remote add origin git@github.repo2:your_username/your_reponame.git
origin:仓库名可以自定义
github.repo2: ssh config配置中对应的主机名
验证关联
git remote -v
