SSH 命令速查
SSH 远程登录、密钥认证、文件传输、端口转发的完整命令速查。
#tech / ops / linux
#type / howto
#status / evergreen
[!info] related notes
SSH 命令速查
核心概念
本地机器 远程服务器
┌──────────┐ SSH 协议 ┌──────────┐
│ ssh 客户端 │──── 端口 22 ────▶│ sshd 服务 │
│ (ssh.exe) │ 加密通道 │ (守护进程) │
└──────────┘ └──────────┘
- 密码认证:输入用户名+密码登录
- 密钥认证:用公私钥对免密登录(推荐)
- 端口转发:通过 SSH 隧道访问远程内网服务
远程登录
| 命令 | 说明 | 常用示例 |
|---|---|---|
ssh <user>@<host> | 密码认证登录(默认端口 22) | ssh ubuntu@192.168.x.x |
ssh <user>@<host> -p <port> | 指定端口登录 | ssh root@server.com -p 2222 |
ssh <user>@<host> -i <key> | 指定私钥登录 | ssh ubuntu@192.168.x.x -i ~/.ssh/my_key |
ssh <user>@<host> "<cmd>" | 远程执行单条命令 | ssh ubuntu@192.168.x.x "df -h" |
ssh -o ServerAliveInterval=60 <user>@<host> | 心跳保活(防超时断线) | 长时间操作时使用 |
ssh -v <user>@<host> | 详细调试输出 | 排查连接问题 |
ssh -V | 查看 SSH 客户端版本 | ssh -V |
密钥认证配置
| 命令 | 说明 | 常用示例 |
|---|---|---|
ssh-keygen -t rsa -f <path> -C "<comment>" | 生成 RSA 密钥对 | ssh-keygen -t rsa -f ~/.ssh/my_key -C "my-server" |
ssh-keygen -t ed25519 -f <path> | 生成 Ed25519 密钥对(更安全更快) | ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 |
ssh-copy-id <user>@<host> | 上传公钥到服务器(默认公钥) | ssh-copy-id ubuntu@192.168.x.x |
ssh-copy-id -i <pubkey> <user>@<host> -p <port> | 指定公钥和端口上传 | ssh-copy-id -i ~/.ssh/my_key.pub root@server.com -p 2222 |
chmod 600 <key> | 设置私钥权限(必须 600) | chmod 600 ~/.ssh/my_key |
chmod 644 <key.pub> | 设置公钥权限 | chmod 644 ~/.ssh/my_key.pub |
ssh-keygen -R <host> | 清除 known_hosts 中的旧密钥 | ssh-keygen -R 192.168.x.x(解决 Host key verification failed) |
SSH 配置文件 (~/.ssh/config)
Host myserver
HostName 192.168.x.x
User ubuntu
Port 2222
IdentityFile ~/.ssh/my_key
ServerAliveInterval 60
配置后可直接 ssh myserver 登录,无需每次输入完整参数。
文件传输 (SCP)
| 命令 | 说明 | 常用示例 |
|---|---|---|
scp <local> <user>@<host>:<remote> | 上传文件到服务器 | scp ./app.apk ubuntu@192.168.x.x:/home/ubuntu/ |
scp <user>@<host>:<remote> <local> | 从服务器下载文件 | scp ubuntu@192.168.x.x:/var/log/syslog ./ |
scp -r <local_dir> <user>@<host>:<remote> | 递归上传目录 | scp -r ./src root@server.com:/opt/app/ |
scp -r <user>@<host>:<remote_dir> <local> | 递归下载目录 | scp -r root@server.com:/var/log/ ./log_backup/ |
scp -P <port> <local> <user>@<host>:<remote> | 指定端口传输(大写 P) | scp -P 2222 ./file.txt root@server.com:/tmp/ |
scp -i <key> <local> <user>@<host>:<remote> | 指定私钥传输 | scp -i ~/.ssh/my_key ./file.txt root@server.com:/tmp/ |
[!warning] 注意 SCP 用大写
-P指定端口,SSH 用小写-p。
SFTP 交互式传输
| 命令 | 说明 |
|---|---|
sftp <user>@<host> | 连接 SFTP(密码认证) |
sftp -P <port> <user>@<host> | 指定端口连接 |
sftp -i <key> <user>@<host> | 密钥认证连接 |
ls | 列出远程目录 |
cd <path> | 切换远程目录 |
lcd <path> | 切换本地目录 |
put <file> | 上传文件 |
get <file> | 下载文件 |
put -r <dir> | 递归上传目录 |
get -r <dir> | 递归下载目录 |
exit / bye | 退出 SFTP |
端口转发(隧道)
本地端口转发
将远程内网服务映射到本地端口。
| 命令 | 说明 | 常用示例 |
|---|---|---|
ssh -L <local_port>:<target>:<target_port> <user>@<host> -N | 本地端口 → 远程目标 | ssh -L 3306:10.0.x.x:3306 ubuntu@192.168.x.x -N |
ssh -fN -L <local_port>:<target>:<target_port> <user>@<host> | 后台运行隧道 | ssh -fN -L 8080:172.17.x.x:80 root@server.com |
场景:访问远程内网的数据库、Web 服务等。
远程端口转发
将本地服务暴露到远程服务器。
| 命令 | 说明 | 常用示例 |
|---|---|---|
ssh -R <remote_port>:<local>:<local_port> <user>@<host> -N | 远程端口 → 本地服务 | ssh -R 8080:localhost:8080 ubuntu@192.168.x.x -N |
场景:让外部通过服务器访问本地开发环境(内网穿透)。
动态端口转发(SOCKS 代理)
| 命令 | 说明 | 常用示例 |
|---|---|---|
ssh -D <local_port> <user>@<host> -N | 创建 SOCKS5 代理 | ssh -D 1080 ubuntu@192.168.x.x -N |
场景:通过远程服务器上网,浏览器设置 SOCKS5 代理 localhost:1080。
远程开发多端口转发
前后端分离项目同时转发多个端口:
ssh -N \
-L 127.0.x.x:5173:localhost:5173 \
-L 127.0.x.x:8080:localhost:8080 \
-L 127.0.x.x:8000:localhost:8000 \
do-dev
-N:不执行远程命令,只做端口转发127.0.x.x:只允许本机访问转发端口(更安全)- 本地端口和远程端口可以不同:
ssh -L 3000:localhost:5173 do-dev
通过跳板机访问 VPC 数据库
# PostgreSQL(经 Droplet 转发到 VPC 私网数据库)
ssh -N -L 15432:private-db-host.db.ondigitalocean.com:25060 do-dev
psql "postgresql://user:pass@localhost:15432/dbname?sslmode=require"
端口转发管理
| 命令 | 说明 |
|---|---|
ps aux | grep ssh | 查看后台 SSH 隧道进程 |
kill <pid> | 关闭隧道 |
ss -lntp | grep 5173 | 检查本地端口是否被监听 |
常见问题速查
| 问题 | 原因 | 解决方案 |
|---|---|---|
Permission denied (publickey) | 公钥未上传或私钥路径错误 | 检查 ~/.ssh/authorized_keys 和 ssh-copy-id |
Host key verification failed | 服务器密钥已变更 | ssh-keygen -R <host> 清除旧密钥 |
Connection refused | sshd 未运行或端口不对 | 检查端口、防火墙、systemctl status sshd |
Connection timed out | 网络不通或防火墙拦截 | 检查网络、ufw allow 22 |
Permissions too open | 私钥权限过大 | chmod 600 ~/.ssh/<key> |
| SSH 连接超时断开 | 无心跳 | 添加 -o ServerAliveInterval=60 或在 config 中配置 |
| 多次输错密码被封 | fail2ban 等安全策略 | 等待解锁或配置密钥认证 |
端口转发 bind: address already in use | 本地端口已被占用 | 换一个本地端口:ssh -L 3000:localhost:5173 do-dev |
| 远程 curl 通但本地不通 | SSH 隧道没开或命令写错 | 检查隧道进程、确认 -L 参数 |