SSH 配置与使用
SSH 真正好用的关键,不是会一条 ssh user@host,而是把密钥、别名、转发和连接习惯一次性整理好。这样你后续接 Git、服务器、隧道、远程数据库时都会轻松很多。
推荐配置顺序
- 先生成一套主密钥
- 配置
~/.ssh/config,给常用主机起别名 - 打通免密登录
- 再根据需要加端口转发、代理跳板和保活设置
为什么推荐先写 config
- 少记 IP、端口和用户名
- 方便多账号、多环境切换
- Git、SSH、端口转发都能复用同一套配置
- 后续排障时更容易看出到底连的是哪台机器
生成密钥
# Ed25519(推荐)
ssh-keygen -t ed25519 -C "[email]"
# RSA(兼容性更好)
ssh-keygen -t rsa -b 4096 -C "[email]"
默认保存在 ~/.ssh/id_ed25519(私钥)和 ~/.ssh/id_ed25519.pub(公钥)。
查看公钥:
cat ~/.ssh/id_ed25519.pub
优先推荐 ed25519,除非你确实遇到老旧系统兼容问题。
多账号配置
编辑 ~/.ssh/config:
# GitHub 个人账号
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519
# GitHub 工作账号
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_work
# 自定义服务器
Host myserver
HostName 192.168.1.100
User root
Port 22
IdentityFile ~/.ssh/id_server
使用工作账号克隆:
git clone git@github-work:org/repo.git
多账号场景里,最常见的问题就是“看起来能连,实际推错仓库或用了错身份”。别名和独立密钥能很好地避免这类混乱。
连接服务器
# 基本连接
ssh user@hostname
# 指定端口
ssh -p 2222 user@hostname
# 使用配置别名
ssh myserver
如果你经常连同一批机器,别再手敲长命令,统一走别名收益非常高。
端口转发
本地转发
将远程端口映射到本地:
# 将远程 3306(MySQL)映射到本地 3306
ssh -L 3306:localhost:3306 user@server
# 后台运行
ssh -fNL 3306:localhost:3306 user@server
远程转发
将本地端口暴露到远程:
# 将本地 3000 暴露到远程 8080
ssh -R 8080:localhost:3000 user@server
动态转发(SOCKS 代理)
ssh -D 1080 user@server
常见使用场景
远程数据库调试
- 用本地转发把远端 MySQL / PostgreSQL 映射到本地
- 本地工具连接
localhost,避免数据库直接暴露公网
临时访问内网站点
- 用本地转发把远端后台面板映射到本地浏览器
- 比直接开放公网端口更安全
跳板机 / 堡垒机场景
- 可以在
config中继续加ProxyJump - 多台主机串联时,配置文件的价值会明显放大
免密登录
# 将公钥复制到服务器
ssh-copy-id user@hostname
# 手动方式
cat ~/.ssh/id_ed25519.pub | ssh user@hostname "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
生产机建议同时关闭密码登录或至少降低密码登录依赖,不要“有密钥还长期保留弱密码”。
保持连接
在 ~/.ssh/config 中添加:
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
TCPKeepAlive yes
长时间跑命令、日志跟踪、数据库代理和不稳定网络环境里,这组参数特别有价值。
Windows SSH Agent
# 启动 SSH Agent 服务
Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
# 添加密钥
ssh-add ~/.ssh/id_ed25519
# 查看已添加的密钥
ssh-add -l
常见问题
Permission denied (publickey)
- 先确认公钥是否真的写进目标服务器
- 检查
IdentityFile是否指向正确私钥 - 再看服务器端
.ssh目录和authorized_keys权限是否正常
GitHub 能 clone,不能 push
大多是账号、仓库权限或远程地址写错,不一定是 SSH 本身坏了。先用 ssh -T git@github.com 验证当前身份。
连接很慢或经常断
- 先看网络本身是否稳定
- 再加
ServerAliveInterval - 如果跨境或经由跳板机,确认 DNS、代理和路径是否绕远
参考链接
- OpenSSH 文档 — 官方手册
- GitHub SSH 文档 — GitHub 指南
- SSH Config 语法 — 完整参数说明
- Git 安装与配置 — 和 Git 远程仓库一起配会更顺手