1123 字
6 分钟
SSH
密钥
生成方法
使用OpenSSH,几乎预装在所有操作系统里
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
# 全局默认(最常用的密钥)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连接的方法很简单
ssh <用户名>@<地址>SSH认证服务器
第一次连接服务器的时候会问你服务器的公钥指纹对错
#比如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算法的公钥指纹,这个指纹其实就是对这个公钥进行哈希运算。
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pubYes
如果公钥指纹和你在物理机上看到的公钥指纹一样,那么你的这次ssh连接就没有连接到错误的服务器上 可以选择yes
- ✅ 信任这个指纹
- ✅ 保存到 ~/.ssh/known_hosts
- ✅ 以后连接自动验证
- ✅ 如果指纹变化会警告
No
如果不是一样的,一定要选择no,不能在不信任的机器上输入密码等敏感操作
fingerprint
你可以手动把你在物理机上知道的服务器公钥输入进去,如果相同那么就yes,不相同no
SSH认证客户端
有密码、密钥的方式认证登录的用户
密钥
服务端
事先需要在服务器上,登录的用户的~/.ssh/authorized_keys里把客户端生成的公钥,每行一个。
[密钥类型] [base64编码的公钥] [注释] ↓ ↓ ↓ ssh-rsa AAAAB3Nza... user@client ssh-ed25519 AAAAC3Nza... device-namechmod 700 ~/.ssh # rwx权限chmod 600 ~/.ssh/authorized_keys #rw权限客户端
然后在客户端的~/.ssh/config里配置
Host [别名] #可以使用*通配符 HostName <ip,域名> IdentityFile ~/.ssh/<私钥文件> User <用户名> Port <端口>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配置文件的路径。
比较重要的配置项
PasswordAuthentication no # 禁用密码认证PubkeyAuthentication yes # 启用公钥认证PermitRootLogin no # 禁止root登录AllowUsers yourusername # 允许哪些用户登录Port 2222 # 修改端口
sudo systemctl restart sshd # 重启ssh服务SSH发送文件
1. scp命令(最常用)
# 基本语法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命令(支持增量传输、断点续传)
# 基本语法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命令(交互式文件传输)
# 启动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 # 退出