SSH 命令速查表
SSH(Secure Shell)是远程服务器管理和安全通信的基石。本速查表覆盖了日常开发运维中最常用的 SSH 命令,从基础连接到高级隧道配置,每个命令都有实际使用示例。无论你是刚接触服务器管理还是需要快速查阅某个 SSH 技巧,这份速查表都能帮到你。
使用场景速查
| 你要做什么 | 用哪个命令 |
| 连接远程服务器 | ssh user@host |
| 生成密钥对 | ssh-keygen -t ed25519 |
| 复制公钥到服务器 | ssh-copy-id user@host |
| 上传文件到远程 | scp file user@host:/path/ |
| 同步目录到远程 | rsync -avz dir/ user@host:/path/ |
| 本地端口转发 | ssh -L 8080:localhost:80 user@host |
| SOCKS 代理 | ssh -D 1080 user@host |
| 调试连接问题 | ssh -vvv user@host |
远程连接
``bash
# 基本连接
ssh user@example.com # 默认端口 22 连接
ssh -p 2222 user@host # 指定端口连接
ssh -i ~/.ssh/key.pem user@host # 使用指定私钥
# 跳板机/堡垒机 ssh -J user@bastion user@internal # 单跳板机 ssh -J user@jump1,user@jump2 user@target # 多级跳板
# 远程执行命令 ssh user@host 'df -h' # 执行单条命令 ssh -t user@host 'top' # 强制 TTY 运行交互式命令 ssh user@host 'bash -s' < script.sh # 在远程执行本地脚本
# 其他连接选项
ssh -N -L 8080:localhost:80 user@host # 仅建隧道,不登录
ssh -4 user@host # 强制使用 IPv4
ssh -6 user@host # 强制使用 IPv6
`
密钥管理
`bash
# 生成密钥对
ssh-keygen -t ed25519 -C "you@email.com" # Ed25519(推荐)
ssh-keygen -t rsa -b 4096 # RSA(兼容旧系统)
ssh-keygen -t ed25519 -f ~/.ssh/custom_key # 自定义文件名
# 复制公钥到服务器 ssh-copy-id user@host # 自动追加到 ~/.ssh/authorized_keys ssh-copy-id -i ~/.ssh/custom_key.pub user@host # 复制指定公钥
# SSH Agent ssh-agent -s # 启动 agent ssh-add ~/.ssh/id_ed25519 # 添加私钥到 agent ssh-add -l # 列出 agent 中的密钥 ssh-add -D # 清空 agent 中所有密钥
# 获取主机公钥 ssh-keyscan github.com # 获取远程主机公钥 ssh-keyscan -t ed25519 example.com # 指定密钥类型获取
# 管理 known_hosts ssh-keygen -R example.com # 移除指定主机密钥 ssh-keygen -F example.com # 查找主机密钥
# 修改/查看密钥
ssh-keygen -p -f ~/.ssh/id_ed25519 # 修改密码短语
ssh-keygen -lf ~/.ssh/id_ed25519.pub # 查看公钥指纹
ssh-keygen -y -f ~/.ssh/id_ed25519 # 从私钥导出公钥
`
客户端配置
`bash
# 在 ~/.ssh/config 中配置主机别名
# 位置:~/.ssh/config
# 权限:chmod 600 ~/.ssh/config
`
单主机配置示例:
`
Host myserver
HostName example.com
User myuser
Port 2222
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
`
通配配置:
`
Host *.internal.example.com
User admin
IdentityFile ~/.ssh/internal-key
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/github-key
`
使用配置后,连接简化为 ssh myserver。也可用 ssh -F ~/.ssh/config-custom myserver 指定使用其他配置文件。
文件传输
`bash
# SCP
scp file.txt user@host:/path/ # 上传文件到远程
scp user@host:/path/file.txt . # 从远程下载文件
scp -r ./dist/ user@host:/var/www/ # 递归上传目录
scp -P 2222 file user@host:/path/ # 指定端口
# RSYNC(推荐用于大文件/目录同步) rsync -avz ./src/ user@host:/path/ # 增量同步到远程 rsync -avz --delete ./src/ user@host:/path/ # 包含删除操作(镜像同步) rsync -avz user@host:/path/ ./backup/ # 从远程同步到本地 rsync -avz -e "ssh -p 2222" ./ user@host:/ # 通过自定义端口
# SFTP
sftp user@host # 交互式文件传输
sftp -oPort=2222 user@host # 指定端口连接
# 进入后可用:ls, cd, get, put, rm, mkdir 等
`
端口转发与隧道
`bash
# 本地端口转发(将远程端口映射到本地)
ssh -L 8080:localhost:80 user@host # 远程 80 → 本地 8080
ssh -L 3306:db-internal:3306 bastion # 通过跳板访问内网数据库
ssh -L 8080:localhost:80 -L 9090:localhost:90 # 同时转发多个端口
# 远程端口转发(将本地端口暴露到远程) ssh -R 8080:localhost:3000 user@host # 本地 3000 → 远程 8080 ssh -R 0.0.0.0:8080:localhost:3000 user@host # 允许外部访问远程端口
# SOCKS5 动态代理 ssh -D 1080 user@proxy # 本地 1080 作为 SOCKS 代理 # 浏览器设置 SOCKS 代理为 localhost:1080,所有流量经远程服务器
# 持久化隧道(使用 autossh,生产推荐)
autossh -M 0 -o "ServerAliveInterval 30" \
-o "ServerAliveCountMax 3" \
-L 3306:localhost:3306 user@host # 自动重连的持久隧道
`
故障排查
`bash
# 调试输出
ssh -v user@host # 详细模式(适合排查连接问题)
ssh -vvv user@host # 极度详细模式(完整的调试输出)
ssh -T git@github.com # 测试 SSH 连接但不登录
# 连接选项调试 ssh -o StrictHostKeyChecking=no user@host # ⚠️ 跳过主机密钥检查(仅测试环境) ssh -o UserKnownHostsFile=/dev/null user@host # 不使用 known_hosts ssh -o LogLevel=DEBUG user@host # 日志级别调整
# 网络测试 ssh -Q cipher # 查看支持的加密算法 ssh -Q mac # 查看支持的 MAC 算法 ssh -Q kex # 查看支持的密钥交换算法
# 服务端配置测试(需 root) sshd -T # 测试 sshd 配置是否正确 netstat -tlnp | grep :22 # 查看 SSH 服务监听状态
`
SSH 配置最佳实践
`bash
# 安全加固建议(服务器端 /etc/ssh/sshd_config)
# 禁用 root 登录 PermitRootLogin no
# 仅允许密钥认证 PasswordAuthentication no PubkeyAuthentication yes
# 限制 SSH 协议版本 Protocol 2
# 指定允许的用户 AllowUsers alice bob
# 更改默认端口(降低扫描攻击) Port 2222
# 修改后重启服务 sudo systemctl restart sshd # 或 sudo service ssh restart ``
连接管理(7)
| 命令 | 难度 | ||
|---|---|---|---|
ssh user@hostSSH 连接到远程服务器 | 基础 | ssh deploy@192.168.1.100 | |
ssh -p <port>指定端口连接(默认 22) | 基础 | ssh -p 2222 user@host | |
ssh -i <keyfile>使用指定私钥连接 | 基础 | ssh -i ~/.ssh/aws-key.pem ec2-user@aws-host | |
ssh -J <jumphost> <target>通过跳板机连接目标服务器 | 中级 | ssh -J user@bastion.example.com user@internal-host | |
ssh -t <host> '<cmd>'强制分配 TTY 并执行远程命令 | 中级 | ssh -t user@host 'top' | |
ssh -N -L <local>:<target>:<remote>仅建立端口转发,不执行远程命令 | 中级 | ssh -N -L 8080:localhost:80 user@host | |
ssh -4 / ssh -6强制使用 IPv4 / IPv6 连接 | 基础 | ssh -4 user@host |
密钥管理(8)
| 命令 | 难度 | ||
|---|---|---|---|
ssh-keygen -t ed25519生成 Ed25519 密钥对(推荐) | 基础 | ssh-keygen -t ed25519 -C "my@email.com" | |
ssh-keygen -t rsa -b 4096生成 RSA 4096 位密钥对(兼容旧系统) | 基础 | ssh-keygen -t rsa -b 4096 | |
ssh-copy-id user@host将公钥复制到远程服务器 | 基础 | ssh-copy-id user@server.example.com | |
ssh-add ~/.ssh/id_ed25519将私钥添加到 SSH agent | 基础 | ssh-add ~/.ssh/id_ed25519 | |
ssh-keygen -p修改 SSH 密钥的密码短语 | 中级 | ssh-keygen -p -f ~/.ssh/id_ed25519 | |
ssh-keygen -R <hostname>从 known_hosts 中移除主机密钥 | 基础 | ssh-keygen -R example.com | |
ssh-add -l列出 SSH agent 中已加载的密钥 | 基础 | ssh-add -l | |
ssh-keyscan <host>获取远程主机的公钥(用于 CI/CD 配置) | 中级 | ssh-keyscan github.com >> ~/.ssh/known_hosts |
配置管理(2)
| 命令 | 难度 | ||
|---|---|---|---|
~/.ssh/configSSH 客户端配置文件 | 中级 | Host myserver
HostName example.com
User myuser
Port 2222
IdentityFile ~/.ssh/id_ed25519
| |
ssh -F <config>使用指定的配置文件 | 中级 | ssh -F ~/.ssh/config-custom myserver |
文件传输(6)
| 命令 | 难度 | ||
|---|---|---|---|
scp <file> user@host:<path>复制文件到远程服务器 | 基础 | scp app.tar.gz deploy@server:/var/www/ | |
scp user@host:<path> <local-dir>从远程服务器复制文件到本地 | 基础 | scp admin@backup:/data/dump.sql ./ | |
scp -r <dir> user@host:<path>递归复制目录到远程 | 基础 | scp -r ./build/ user@server:/var/www/html/ | |
rsync -avz <src> user@host:<dest>增量同步本地目录到远程(推荐用于备份/部署) | 中级 | rsync -avz --delete ./dist/ user@server:/var/www/ | |
rsync -avz user@host:<src> <local-dest>从远程服务器增量同步到本地 | 中级 | rsync -avz user@server:/backups/ ./backups/ | |
sftp user@hostSFTP 交互式文件传输 | 基础 | sftp deploy@staging.example.com |
端口转发(4)
| 命令 | 难度 | ||
|---|---|---|---|
ssh -L <local-port>:<target>:<target-port> <host>本地端口转发(将远程端口映射到本地) | 中级 | ssh -L 3306:database.internal:3306 bastion | |
ssh -R <remote-port>:<local>:<local-port> <host>远程端口转发(将本地端口暴露到远程) | 中级 | ssh -R 8080:localhost:3000 user@public-host | |
ssh -D <local-port> <host>SOCKS5 动态代理(本地端口做代理) | 中级 | ssh -D 1080 user@proxy-server | |
autossh -M 0 -L ...自动重连的持久化 SSH 隧道 | 高级 | autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -L 3306:localhost:3306 user@host |
故障排查(10)
| 命令 | 难度 | ||
|---|---|---|---|
ssh -v <host>详细模式(查看连接过程) | 基础 | ssh -v user@host | |
ssh -vvv <host>极度详细模式(完整调试信息) | 中级 | ssh -vvv user@host | |
ssh -o ServerAliveInterval=<seconds>设置保活间隔,防止连接超时断开 | 中级 | ssh -o ServerAliveInterval=60 user@host | |
ssh -o StrictHostKeyChecking=no跳过主机密钥检查(⚠️ 仅用于测试环境) 禁用主机密钥检查会降低安全性,可能遭受中间人攻击。仅用于临时测试环境。 | 中级 | ssh -o StrictHostKeyChecking=no user@host | |
ssh -Q cipher列出 SSH 客户端支持的加密算法 | 高级 | ssh -Q cipher | |
ssh -Q mac列出支持的 MAC 算法 | 高级 | ssh -Q mac | |
ssh -Q kex列出支持的密钥交换算法 | 高级 | ssh -Q kex | |
ssh -T <host>测试 SSH 连接(不分配终端) | 中级 | ssh -T git@github.com | |
ssh -o UserKnownHostsFile=/dev/null跳过 known_hosts 文件(⚠️ 仅测试环境) 跳过 known_hosts 验证会降低安全性,仅用于临时测试。 | 中级 | ssh -o UserKnownHostsFile=/dev/null user@host | |
sshd -T测试 sshd 服务器配置是否正确 | 高级 | sshd -T |