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_keysssh-copy-id
Host key verification failed服务器密钥已变更ssh-keygen -R <host> 清除旧密钥
Connection refusedsshd 未运行或端口不对检查端口、防火墙、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 参数
创建于 2025/1/1 更新于 2026/7/15