1123 字
6 分钟
SSH
2026-01-17
无标签

密钥#

生成方法#

使用OpenSSH,几乎预装在所有操作系统里

Terminal window
ssh-keygen -t ed25519
-t 指定算法ed25519、rsa4096、rsa2048
-C 注释"用途、角色、邮箱"
-N 密码"password"

用途#

  • 每次ssh,客户端和服务端都会生成一个临时的公钥和私钥
  • 服务端会在/etc/ssh中生成持久的服务端公钥和私钥,一个服务器一个
  • 客户端可以选择生成密钥来登录服务器
  • 还有数不胜数的密钥被广泛用于各种服务。比如wireguard,github……

管理方法#

文件结构#

~/.ssh/
├── id_ed25519 # 主密钥(个人通用)
├── id_ed25519.pub # 公钥
├── id_ed25519_github # GitHub专用
├── id_ed25519_work # 工作专用
├── id_ed25519_prod # 生产环境专用
├── config # SSH配置文件
├── known_hosts # 已知主机
└── authorized_keys # 服务器端:允许的客户端密钥

ssh config#

~/.ssh/config
# 全局默认(最常用的密钥)
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519 # 主密钥
# GitHub - 使用专用密钥
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github
IdentitiesOnly yes # 重要:只用这个密钥

SSH连接#

用ssh连接的方法很简单

Terminal window
ssh <用户名>@<地址>

SSH认证服务器#

第一次连接服务器的时候会问你服务器的公钥指纹对错

Terminal window
#比如
ED25519 key fingerprint is SHA256:cZlatvBz9Hdxd7G7aLV8cDSQKlCqdLY0dHLCwH8vFyA.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

需要事先在安全的环境下,比如说在服务器物理机上看一下服务器的公钥的指纹 比如说这个就是用ED25519算法的公钥指纹,这个指纹其实就是对这个公钥进行哈希运算。

Terminal window
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub

Yes#

如果公钥指纹和你在物理机上看到的公钥指纹一样,那么你的这次ssh连接就没有连接到错误的服务器上 可以选择yes

  • ✅ 信任这个指纹
  • ✅ 保存到 ~/.ssh/known_hosts
  • ✅ 以后连接自动验证
  • ✅ 如果指纹变化会警告

No#

如果不是一样的,一定要选择no,不能在不信任的机器上输入密码等敏感操作

fingerprint#

你可以手动把你在物理机上知道的服务器公钥输入进去,如果相同那么就yes,不相同no

SSH认证客户端#

有密码、密钥的方式认证登录的用户

密钥#

服务端#

事先需要在服务器上,登录的用户的~/.ssh/authorized_keys里把客户端生成的公钥,每行一个。

[密钥类型] [base64编码的公钥] [注释]
↓ ↓ ↓
ssh-rsa AAAAB3Nza... user@client
ssh-ed25519 AAAAC3Nza... device-name
Terminal window
chmod 700 ~/.ssh # rwx权限
chmod 600 ~/.ssh/authorized_keys #rw权限

客户端#

然后在客户端的~/.ssh/config里配置

Host [别名] #可以使用*通配符
HostName <ip,域名>
IdentityFile ~/.ssh/<私钥文件>
User <用户名>
Port <端口>
Terminal window
ssh <别名> #就等价于`ssh -i ~/.ssh/<私钥文件> -l <用户名> -p <端口> <ip,域名>`,
ssh user@IP #等价于:ssh -l user IP
#如果没有指明私钥的路径,ssh会尝试:
# 1. 默认密钥(~/.ssh/id_*)
# 2. 如果没有匹配的密钥,就降级到密码
#如果密钥生成的时候还有密码的话可能会提示你输入密码。

密码#

就是最普通的登录方式

ssh配置#

/etc/ssh/sshd_config,ssh配置文件的路径。 比较重要的配置项

Terminal window
PasswordAuthentication no # 禁用密码认证
PubkeyAuthentication yes # 启用公钥认证
PermitRootLogin no # 禁止root登录
AllowUsers yourusername # 允许哪些用户登录
Port 2222 # 修改端口
sudo systemctl restart sshd # 重启ssh服务

SSH发送文件#

1. scp命令(最常用)#

Terminal window
# 基本语法
scp [选项] 源文件 用户名@主机名:目标路径
# 示例:
# 上传本地文件到远程
scp file.txt user@remote-host:/home/user/
scp -r /local/folder user@remote-host:/remote/path/ # 传输整个目录
# 从远程下载到本地
scp user@remote-host:/path/to/file.txt ./local/path/

2. rsync命令(支持增量传输、断点续传)#

Terminal window
# 基本语法
rsync [选项] 源文件 用户名@主机名:目标路径
# 示例:
rsync -avz file.txt user@remote-host:/home/user/
rsync -avz --progress /local/folder/ user@remote-host:/remote/folder/
# -a: 归档模式(保留权限等)
# -v: 显示详情
# -z: 压缩传输
# --progress: 显示进度

3. sftp命令(交互式文件传输)#

Terminal window
# 启动sftp会话
sftp user@remote-host
# 在sftp会话中的常用命令:
put local-file.txt # 上传文件
put -r local-folder/ # 上传目录
get remote-file.txt # 下载文件
cd /remote/path # 切换远程目录
lcd /local/path # 切换本地目录
ls # 列出远程文件
lls # 列出本地文件
exit # 退出

额外的防护措施#

Fail2ban :自动防御SSH暴力破解#

SSH
https://blog.cannian.space/posts/2026-1-17-ssh/
作者
Cannian
发布于
2026-01-17
许可协议
CC BY-NC-SA 4.0