SSH 命令速查表 - SSH 连接与配置常用命令大全
面向要免密登录、从跳板机进入内网、或把远程端口映射到本机调试的开发与运维。SSH 的价值在密钥与 config 的复用:把常用的 Host、跳板、端口转发固化进 ~/.ssh/config,就不必每次敲一长串参数。读完能生成并正确授权密钥对实现免密登录,用 ProxyJump 一层层跨过堡垒机,用 -L 把一个远程服务暴露到本机 localhost 上调试。
典型使用场景
远程登录与文件传输、免密登录(密钥)配置、端口转发(隧道)、排查连接超时、权限过宽被拒(Permission denied (publickey))与主机指纹变更告警。
连接与认证 5
ssh user@hostssh -p 2222 user@hostssh -i ~/.ssh/id_ed25519 user@hostssh -vvv user@hostssh -o ConnectTimeout=5 user@host密钥管理 5
ssh-keygen -t ed25519 -C "tom@example.com"ssh-keygen -t rsa -b 4096 -C "tom@example.com"ssh-copy-id -i ~/.ssh/id_ed25519.pub user@hostssh-keygen -lf ~/.ssh/id_ed25519.pubeval $(ssh-agent) && ssh-add ~/.ssh/id_ed25519配置文件 ~/.ssh/config 6
Host prodHostName 1.2.3.4User deployIdentityFile ~/.ssh/id_ed25519ProxyJump bastionLocalForward 8080 127.0.0.1:80端口转发与代理 5
ssh -L 8080:127.0.0.1:80 user@hostssh -R 9090:127.0.0.1:80 user@hostssh -D 1080 user@hostssh -N -L 8080:127.0.0.1:80 user@hostssh -J bastion user@internal参数矩阵
| 参数 | 作用 | 示例 |
|---|---|---|
-i | 指定私钥文件 | ssh -i ~/.ssh/id_ed25519 user@host |
-p | 指定端口(默认 22) | ssh -p 2222 user@host |
-L | 本地端口转发隧道 | ssh -L 8080:127.0.0.1:80 user@host |
-R | 远程端口转发隧道 | ssh -R 9000:localhost:3000 user@host |
-N | 只建隧道不打开 shell | ssh -N -L 5432:localhost:5432 db@host |
-f | 后台运行 | ssh -fN -L 8080:localhost:80 user@host |
scp -r | 递归拷贝目录 | scp -r ./app user@host:/srv/app |
StrictHostKeyChecking | 控制主机指纹校验策略 | ssh -o StrictHostKeyChecking=no user@host |
ProxyJump | 经跳板机连接目标 | ssh -J jump@bastion user@host |
IdentitiesOnly | 只用指定密钥,避免密钥过多被拒 | ssh -o IdentitiesOnly=yes -i key user@host |
易错点与避坑指南
现象密钥登录报 Permission denied (publickey)。
原因私钥权限过宽(如 644)、authorized_keys 权限不对,或服务端 PubkeyAuthentication 关闭。
处置chmod 600 ~/.ssh/id_* 与 700 ~/.ssh;服务端确认 PubkeyAuthentication yes 与 AuthorizedKeysFile 路径。
现象连接长时间无响应后超时。
原因网络不可达、防火墙拦截 22、或 UseDNS 反向解析慢。
处置先 ping/ telnet host 22 验证连通;服务端设 UseDNS no 与 GSSAPIAuthentication no 加速握手。
现象WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
原因目标主机重装/换 IP,指纹与 known_hosts 不符(可能中间人)。
处置确属正常变更后,ssh-keygen -R host 删除旧记录再重连;异常变更须先核实再继续。
现象scp/ssh 因客户端有多个密钥被服务端拒绝。
原因ssh 依次尝试所有密钥,触发服务端 MaxAuthTries 限制。
处置用 -o IdentitiesOnly=yes -i 指定唯一密钥;或在 ~/.ssh/config 按主机绑定 IdentityFile。
现象隧道建立后端口仍连不上。
原因转发目标地址在远端不是 localhost,或 BindAddress 受限。
处置确认 -L 本地:远端host:远端port 的远端地址在服务器本地可达;检查 GatewayPorts 设置。
现象root 直接登录被拒。
原因PermitRootLogin 设为 no(安全最佳实践)。
处置用普通用户登录后 sudo;确需 root 时设 PermitRootLogin prohibit-password 并仅用密钥。
排障路径
1详细输出连接过程
ssh -v user@host看到是认证失败、握手慢还是连接被拒,定位阶段。
2验证端口连通性
nc -zv host 22区分网络层不通与服务未监听。
3清理失效主机指纹后重连
ssh-keygen -R host仅在确认主机变更合法后执行。
4测试免密登录是否生效
ssh -o BatchMode=yes user@host echo okBatchMode 下不会弹出密码提示,可直接验证密钥登录。
命令示例
三步装好 ed25519 免密登录
ssh-keygen -t ed25519 -C "tom@example.com"
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@host
ssh user@host先在本地生成密钥对,再把公钥推给服务器。私钥始终留在本地,服务器只拿到公钥;免密登录失败时先回看这条链路哪一步漏了。
输出
Generating public/private ed25519 key pair. Your identification has been saved in /home/tom/.ssh/id_ed25519 Number of key(s) added: 1.
核对服务器主机密钥指纹,防止中间人
ssh-keygen -lf ~/.ssh/id_ed25519.pub输出第一段是密钥长度/类型,第二段是 SHA256 指纹,括号前是注释。把这个指纹和服务器管理员给出的值逐字比对,指纹不符就别继续登录。
输出
256 SHA256:8kQ1OQ0pZ3mLpXv2Rb7nT4cYdE6sA1fH5gJ9uI0oLk tom@example.com (ED25519)
认证失败时打开详细调试
ssh -vvv -o ConnectTimeout=5 user@hostssh -vvv 会打印出协商了哪些密钥算法、服务器接受了哪些公钥、卡在哪一步认证;连不上时加 -o ConnectTimeout=5 避免网络不通时无限挂住。
输出
debug1: Authenticated to host (22).
一条命令穿跳板机进内网
ssh -J bastion user@internal等价于在 ~/.ssh/config 里写 ProxyJump bastion,省掉「先登跳板机再从里面 ssh 一次」的两层会话,也避免第二层没带上密钥文件。
后台挂着隧道调试远端服务
ssh -N -L 8080:127.0.0.1:80 user@host-N 表示不执行远程命令只做转发,配合 & 或 tmux 常驻;这样本机 8080 就是远端的 80,本地改前端指向 8080 就能打到远端后端。
常见坑与注意事项
- ssh-copy-id 会把公钥追加到服务器的 authorized_keys 并默认新建该文件;重复执行会累积多条相同公钥,清理不及时会拖慢登录与审计。
- ssh -A(转发本地 agent)或把私钥拷到服务器上,私钥一旦泄露即视为全部主机沦陷;多密钥场景应改用 ssh-agent + ssh-add。
- 配置 ~/.ssh/config 时若权限不是 600,ssh 会直接拒绝使用该文件,报 Permissions too open 而难以联想到是权限问题。
- ssh -J 跳板机与多层 ssh -t 嵌套不同:前者隧道退出时内层连接一起断,正在跑的交互程序会被 SIGHUP 杀掉,长任务要挂 nohup 或 screen。
- 第一次连接新主机时弹出主机密钥指纹确认,此处输 yes 会把该指纹永久写入 known_hosts;确认之前应与管理员核对指纹,否则等于主动放弃中间人防护。
- 把 22 端口改成非常规端口并不等于安全,ssh -p 只换端口不改变认证强度;且所有 ssh-copy-id / 自动化脚本里的硬编码端口都要同步改,漏改就是批量连接失败。
提示
- 免密登录用 ssh-copy-id 推公钥,手动拼 authorized_keys 容易踩权限和格式坑。
- ~/.ssh 目录权限要 700,私钥要 600,权限太松 ssh 会拒绝使用。
- 端口转发加 -N -f 可放到后台跑,但记得用 ssh -O exit 或 kill 关掉,避免遗留进程。
常见问题
配置了密钥免密登录,服务器还是反复要密码,怎么排查?
按顺序查三处:先在服务器上执行 sshd -T | grep authorizedkeysfile 确认公钥文件路径是否就是你放的位置(很多发行版默认是 .ssh/authorized_keys2 或在 .ssh/ 下但要求属主是登录用户);再确认目录与文件权限,.ssh 需为 700、authorized_keys 需为 600,权限过宽 sshd 会静默拒绝;最后在客户端用 ssh -vvv user@host 看是否真的发送了公钥,如果日志里没有Offering public key,说明客户端就没找到对应私钥,多半是 ssh-agent 没加载或 ~/.ssh/config 里 IdentityFile 路径写错。
ssh_config 里的 Host 别名为什么不生效?
最常见的原因是缩进错了。Host、HostName、User、IdentityFile 这些关键字必须顶格写,不能有任何前导空格或制表符,它们后面的值可以有缩进。另外 ssh 只认第一个匹配到的 Host 块,所以通配符别名要放在具体主机之前,否则永远匹配不到。改完可以用 ssh -G 别名 直接打印最终生效的配置来验证,而不是靠反复连接试错。
本地转发和动态代理该怎么选?
看你要的是「固定目标」还是「不确定目标」。ssh -L 8080:127.0.0.1:80 是本地转发,目标写死在命令里,适合访问远端某个已知服务,比如把远端 80 映射到本地 8080。ssh -D 1080 是动态转发,它开的是一个 SOCKS5 代理端口,由客户端每个请求决定连哪里,适合浏览器要访问多个远端站点、或需要临时把流量走远端出口的场景。两者都可以配 -N 只转发不执行命令,放后台当隧道用。
连接被直接断开,没有任何报错信息,怎么定位?
先用 ssh -vvv 打开详细日志,重点看断开前最后的几行:如果停在 kex_exchange_identification 说明还没进认证阶段,通常是服务端 sshd 没起、端口被防火墙拦或 MaxStartups 限流;如果停在认证成功后立刻断开,多半是目标用户的 shell 启动脚本里有非零退出的命令,或者客户端的 LocalCommand 执行失败。另外可以主动降级排查:ssh -o "AddressFamily=inet" -p 22 排除 IPv6 解析异常,ssh -o ServerAliveInterval=15 排除空闲超时断连。
密钥类型应该选 ed25519 还是 RSA?
新部署一律选 ed25519,它密钥更短、握手更快,现代 OpenSSH(7.2 以上)全面支持。RSA 4096 保留给两类场景:对接的老旧系统或硬件设备只支持 RSA,或者某些仍在跑的旧版客户端不接受 ed25519。需要注意的是 RSA 密钥位数低于 3072 在部分发行版的新策略下会被 sshd 拒绝,所以选 RSA 就直接上 4096。若同时存在 RSA 和 ed25519 两把密钥,客户端会优先尝试 ed25519,可以在 ~/.ssh/config 里用 Host 指定 IdentityFile 强制用哪一把。
由 巧匠 维护
公开更新于 2026年7月21日,内容持续校对官方文档。