密码登录适合临时验证,长期管理服务器时更适合使用公钥认证。下面把客户端、服务器和网络设备三侧的设置拆开,便于定位“密钥不生效”和“连接一段时间后断开”这两类问题。
先确认认证链路
公钥认证至少包含三份信息:客户端持有的私钥、服务器账号目录中的公钥,以及 Xshell 会话中选中的私钥。三者必须属于同一对密钥。服务器账号、家目录和 SSH 服务配置也会影响最终结果。
- 确认登录用户名,不要把 A 用户生成的公钥放到 B 用户目录。
- 在 Xshell 中找到用户身份验证设置,选择 Public Key 和对应私钥。
- 把公钥内容追加到服务器用户的
~/.ssh/authorized_keys,不要把私钥复制到服务器。 - 检查目录和文件权限,再断开当前会话重新测试。
检查服务器端权限
常见权限参考是 ~/.ssh 使用 700,authorized_keys 使用 600,文件所有者应为实际登录用户。若服务器启用了 SELinux、集中认证或额外的 AllowUsers 规则,还要结合系统日志判断。
排查原则:不要为了让认证通过而扩大整个家目录权限。先确认所有者、路径和 SSH 服务读取的配置文件,再做最小范围调整。
让空闲会话更稳定
在 Xshell 会话属性中启用保持活动消息,并根据网络设备策略设置合理间隔。服务器端也可能配置 ClientAliveInterval 和 ClientAliveCountMax。修改服务端配置后,要先检查配置语法,再按发行版方式重载 SSH 服务。
理解三种转发
- 本地转发:本机端口经 SSH 连接访问远端网络中的指定服务。
- 远程转发:服务器侧端口转到本地服务,需特别确认服务器允许远程绑定。
- 动态转发:建立 SOCKS 代理,由客户端应用决定后续目标。
配置转发前应明确监听地址、目标地址和允许访问的范围,不要把调试端口暴露给不需要访问的网络。
按错误信息缩小范围
Permission denied (publickey):检查用户名、私钥匹配关系、公钥换行、文件权限和服务端日志。Connection timed out:检查地址解析、网络路由、云安全组、防火墙和端口监听。Connection refused:检查 SSH 服务状态和实际监听端口。- 连接一段时间后断开:对照客户端心跳、服务器存活检测和中间网络设备的空闲超时。