SSH 命令速查表 - SSH 连接与配置常用命令大全

面向要免密登录、从跳板机进入内网、或把远程端口映射到本机调试的开发与运维。SSH 的价值在密钥与 config 的复用:把常用的 Host、跳板、端口转发固化进 ~/.ssh/config,就不必每次敲一长串参数。读完能生成并正确授权密钥对实现免密登录,用 ProxyJump 一层层跨过堡垒机,用 -L 把一个远程服务暴露到本机 localhost 上调试。

系统与运维·共 21 条命令·最后更新 2026-07-21
ssh密钥隧道linux

典型使用场景

远程登录与文件传输、免密登录(密钥)配置、端口转发(隧道)、排查连接超时、权限过宽被拒(Permission denied (publickey))与主机指纹变更告警。

连接与认证 5

ssh user@host
默认 22 端口登录,user 省略时用当前用户名
ssh -p 2222 user@host
指定端口,服务器改了端口时用
ssh -i ~/.ssh/id_ed25519 user@host
指定私钥登录,多密钥时常用
ssh -vvv user@host
打印详细调试信息,认证失败时排查用
ssh -o ConnectTimeout=5 user@host
设置连接超时,防止卡死

密钥管理 5

ssh-keygen -t ed25519 -C "tom@example.com"
生成 ed25519 密钥,比 RSA 更短更快
ssh-keygen -t rsa -b 4096 -C "tom@example.com"
生成 RSA 4096 位密钥,兼容老服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@host
把公钥推到服务器,实现免密登录
ssh-keygen -lf ~/.ssh/id_ed25519.pub
查看密钥指纹和长度,核对服务器 host key 用
eval $(ssh-agent) && ssh-add ~/.ssh/id_ed25519
启动 agent 并加载私钥,避免重复输密码

配置文件 ~/.ssh/config 6

Host prod
定义主机别名,后续 ssh prod 直接连,省去记长命令
HostName 1.2.3.4
实际连接的 IP 或域名
User deploy
默认登录用户,省去每次 user@host
IdentityFile ~/.ssh/id_ed25519
指定该主机使用的私钥
ProxyJump bastion
通过跳板机连目标机,替代 ssh -t ssh -t 多层跳转
LocalForward 8080 127.0.0.1:80
登录时自动建立本地端口转发

端口转发与代理 5

ssh -L 8080:127.0.0.1:80 user@host
本地端口转发,访问本地 8080 等于访问远端 80
ssh -R 9090:127.0.0.1:80 user@host
远程端口转发,把本地服务暴露到远端
ssh -D 1080 user@host
动态 SOCKS5 代理,所有流量走远端
ssh -N -L 8080:127.0.0.1:80 user@host
只转发不执行命令,开后台隧道用
ssh -J bastion user@internal
通过跳板机直连内网机器,等价于 ProxyJump

参数矩阵

参数作用示例
-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只建隧道不打开 shellssh -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. 1详细输出连接过程

    ssh -v user@host

    看到是认证失败、握手慢还是连接被拒,定位阶段。

  2. 2验证端口连通性

    nc -zv host 22

    区分网络层不通与服务未监听。

  3. 3清理失效主机指纹后重连

    ssh-keygen -R host

    仅在确认主机变更合法后执行。

  4. 4测试免密登录是否生效

    ssh -o BatchMode=yes user@host echo ok

    BatchMode 下不会弹出密码提示,可直接验证密钥登录。

命令示例

三步装好 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@host

ssh -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日,内容持续校对官方文档。

联系我们

命令或描述有误?提交反馈、商务合作或产品建议都可发送邮件给我们。

联系我们