ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Ubuntu安装配置SSH Server:在线/离线部署、密钥登录与连接排错

Ubuntu安装配置SSH Server:在线/离线部署、密钥登录与连接排错 新装完 Ubuntu 之后很多人第一件真正想做的事其实是把它从能用变成好连。尤其当你把系统塞进虚拟机、装在一台没有屏幕的旧笔记本上或者干脆丢在机柜里吃灰键盘和显示器就变成了奢侈品。这时候 Ubuntu 安装 SSH Server 就成了那根救命绳在任意一台机器的终端里敲一行命令就能进到 Ubuntu 内部跑命令、传文件、改配置体验跟坐在它面前几乎没有差别而且比图形界面远程流畅得多。这篇内容写给两类人看。一类是刚接触 Ubuntu、被Connection refused折磨到半夜的新手想搞清楚到底哪一步没做对另一类是把 Ubuntu 当开发机或服务机用的人需要通过 SSH 远程跑编译、挂开发板、传数据集。我会按自己的实际操作顺序把 apt 在线安装、内网离线安装、sshd_config里真正值得改的参数、密钥免密登录、防火墙与虚拟网络、以及那些搜索引擎上很难一次凑齐的报错排查完整捋一遍。命令都在 Ubuntu 22.04 LTS 和 24.04 LTS 上实机跑过可以直接抄作业。1. Ubuntu 上为什么一定要装 SSH Server1.1 它和桌面远程根本不是一个量级的东西很多人第一次听到 SSH会下意识把它和远程桌面归到一类觉得不就是远程控制嘛。真用起来你会发现这俩东西的体验差距大到不像同一个时代的产品。桌面远程是把整个图形画面压缩成视频流推给你分辨率一高、网络一抖画面就开始糊、鼠标就开始飘传文件还得额外开共享目录。SSH 传的是纯文本指令和结果一次交互的数据量可能只有几 KB在 4G 热点、跨城市甚至跨运营商网络下都能保持跟本地终端一模一样的响应速度。更关键的是可组合性。SSH 天生就是对着命令行设计的这意味着你可以把整个工作流脚本化一条ssh build-server make -j8就能在远端跑编译rsync -e ssh可以直接把同步通道建在 SSH 上IDE 的远程开发插件、Git 的远端操作、Ansible 的批量下发底层跑的都是 SSH。图形远程做不到这些它是给人眼看的SSH 是给人和脚本都能用的。提示如果你只是偶尔想看看 Ubuntu 的桌面长什么样装个 VNC 或者用系统自带的远程桌面就够了。但只要涉及到长时间运维、跑任务、写代码SSH Server 都是必装项没有替代品。1.2 这几类场景下它是刚需而不是可选第一种是虚拟机环境。VMware 或 VirtualBox 里跑 Ubuntu直接在虚拟机窗口里操作有多难受用过的人都懂剪贴板不通、窗口缩放别扭、快捷键被宿主机抢走。装好 SSH Server 之后你在宿主机的 Windows Terminal 或 macOS 终端里连上去复制粘贴、分屏、滚动回看全都正常了虚拟机的窗口甚至可以最小化不管它。第二种是无头设备。老笔记本改的 NAS、迷你主机、工控机、树莓派和各类开发板这些设备要么没有显示输出要么接了屏幕也没地方放。它们从开机那一刻起就指望通过网络被人访问SSH Server 是唯一入口。第三种是团队协作和自动化。CI 构建机、跳板机、内网测试服务器需要被多个人或者流水线系统访问。这种场景对 SSH 的要求更高不只是能连上还要考虑密钥管理、访问审计、连接稳定性和安全加固后面几个章节会重点讲。还有一种容易被忽略的场景双系统。Windows 和 Ubuntu 双系统的时候你正在 Windows 里写代码忽然想验证一下 Linux 下的编译结果重启切换系统太费时间装好 SSH 之后直接在 Windows 终端里连过去效率完全不同。2. 动手之前先把这几件事确认掉2.1 系统版本、网络连通性与一个关键的认知纠正先执行lsb_release -a看清楚版本号。这不是走流程而是因为不同版本的 Ubuntu 在软件包依赖和服务命名上有细节差异比如 Ubuntu 22.04 之后 systemd 单元支持 drop-in 目录18.04 及更早的写法在 24.04 上虽然还能用但改配置的逻辑已经不太一样了。确认版本后面查资料才不会对错文档。然后确认网络。ip a看一眼网卡有没有拿到地址ip route确认默认网关存在ping -c 3 网关地址测试局域网通不通ping -c 3 223.5.5.5测试外网。这一步的意义在于区分故障层级如果连网关都不通那问题在网络配置跟 SSH 一点关系都没有这时候去折腾 SSH 纯属浪费时间。注意很多 Ubuntu 桌面版默认只装了openssh-client没有装openssh-server。也就是说你从 Ubuntu 往外连别的机器是没问题的但别人连不进来。这个认知差是新手最常踩的第一个坑先去dpkg -l | grep openssh确认一下看到只有 client 没有 server那装就对了。2.2 软件源状态和安装前的必要清理sudo apt update是安装前必须跑的一步它刷新的是软件包索引。如果这一步报错先别急着装 SSH因为报错通常意味着源地址不可达或者 GPG 密钥过期直接装也大概率失败。常见的报错有Could not resolve和NO_PUBKEY前者是 DNS 或网络问题后者是密钥环需要重新导入。如果apt update卡在某个源上很久可以用sudo apt update -o Acquire::http::Timeout10缩短超时快速跳过不通的源。国内环境建议把源换到就近的镜像站速度差异非常明显几十 MB 的包下载体验完全不同。换源就是编辑/etc/apt/sources.list或者/etc/apt/sources.list.d/下的文件把域名替换掉改之前先cp一份备份。另外顺手检查一下磁盘空间df -h看根分区有没有剩余空间。这个看起来多余但我确实遇到过磁盘写满导致包解压失败的情况报错信息还特别不直观排查了半天才想到是空间问题。装 SSH 本身不占多少空间但依赖包加在一起也要几十 MB留个几百 MB 余量比较稳妥。3. 正式安装 openssh-server在线和离线两条路3.1 在线安装一条命令搞定然后必须做三项验证有外网的情况下事情非常简单sudo apt update sudo apt install openssh-server -y装完之后别急着从别的机器连先在本地做三项验证这是我自己养成的习惯能把问题范围缩小一大半。第一项看服务状态systemctl status ssh。这里有个细节值得单独说Ubuntu 和 Debian 系的服务单元名字叫ssh而不是很多教程里写的sshd这是 Red Hat 系CentOS、Fedora的叫法。虽然 Ubuntu 上sshd作为别名也能用但写ssh更保险也符合系统实际配置。第二项看端口监听ss -tlnp | grep :22。正常应该看到sshd进程监听在0.0.0.0:22和[::]:22上。如果什么都没输出说明 sshd 根本没起来去看journalctl -u ssh -n 50的日志。第三项本地回环测试ssh 用户名127.0.0.1。这一步能连上说明服务本身没问题剩下的故障一定出在网络或防火墙层面。这个分层判断能帮你省掉大量盲目试错。3.2 内网离线环境下的包依赖处理内网机器、隔离环境、没有外网出口的服务器就需要离线安装。这里最大的坑不是下载包而是依赖关系。openssh-server的 deb 包并不是孤立的它依赖openssh-client、openssh-sftp-server、libc6、libssl、libwrap0、libaudit、libsystemd等一系列东西漏一个dpkg -i就会卡在依赖报错上。最省事的方法是在一台同版本、同架构、有外网的 Ubuntu 上下载完整依赖链apt-get install --download-only -o Dir::Cache::archives/tmp/sshdebs openssh-server这个命令会把主包和所有依赖全部下载到/tmp/sshdebs目录把它打包拷到目标机器然后sudo dpkg -i /tmp/sshdebs/*.deb如果还是报依赖缺失用sudo apt-get -f install让 apt 尝试修复或者干脆把 Ubuntu 的安装 ISO 挂载成本地源sudo mount -o loop ubuntu-24.04.iso /mnt再把/mnt配成 apt 源这样依赖问题会自动解决。这个思路在处理任何离线安装场景时都通用比手工收集 deb 包靠谱得多。提示不建议在 Ubuntu 上用源码编译的方式装 openssh-server除非你有非常特殊的定制需求。因为源码编译会绕过 PAM 认证和 systemd 集成导致密钥登录、/run/sshd目录创建、服务自启这些东西全都要手动配维护成本远高于收益。4. sshd_config 逐项拆解真正值得改的只有那几个4.1 配置文件的结构变化与安全修改姿势OpenSSH 的配置文件在/etc/ssh/sshd_config。从 Ubuntu 22.04 开始这个主文件末尾会有一行Include /etc/ssh/sshd_config.d/*.conf也就是说支持把配置拆成小文件放在sshd_config.d目录里。这个机制有个非常容易踩的坑drop-in 文件里的配置会先被读取而 SSH 的规则是同一个参数第一次出现生效所以如果某个*.conf里写了PasswordAuthentication no你在主文件里把它改成yes是没用的主文件那行会被忽略。修改前一定先备份sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date %F)。改完先做语法检查sudo sshd -t这个命令会告诉你哪一行的语法有问题通过了再sudo systemctl reload ssh。用reload而不是restart原因是 reload 不会掐断已经建立的连接你正在跑长任务的时候改配置也不会把自己踢下线。4.2 端口、监听地址和协议族的取舍默认端口是 22很多人会改成别的端口比如Port 2222。这么做的意义主要是减少自动化扫描带来的噪音日志不是说改了端口就安全了扫描器照样能扫到只是随手扫的脚本会少一些。监听地址用ListenAddress控制。如果你的机器有多张网卡比如一张连内网、一张连外网可以用ListenAddress 192.168.1.10让 sshd 只监听内网那张网卡这是一个很实用但常被忽略的加固手段。只监听 IPv4 的话加一行AddressFamily inet能避免一些 IPv6 相关的连接困惑。MaxStartups 10:30:100控制未认证连接的并发数默认值在正常场景够用但如果你的机器面对大量并发连接比如 CI 场景调高一点能减少连接被拒的概率。格式是起始值:随机丢弃百分比:绝对上限理解成最大并发连接的限制就行。4.3 认证参数才是安全的核心PermitRootLogin建议设成prohibit-password意思是 root 不能用密码登录但可以用密钥登录。这个折中方案适合需要 root 执行运维任务的场景。如果你能接受用普通用户登录再sudo那就直接设成no这是最干净的做法。PasswordAuthentication是争议最大的一个。设成yes方便但密码可以被暴力破解尤其是在暴露到公网的机器上设成no就只能用密钥登录安全性高一个档次代价是每台客户端都要配好密钥。我的建议是从密码登录起步先确认一切正常然后立刻转成密钥登录并且把密码登录关掉这个顺序能避免改了配置之后自己都进不去了的尴尬。PubkeyAuthentication yes是密钥登录的开关默认就是开的一般不用动。AllowUsers可以限定只允许特定用户登录比如AllowUsers deploy admin这是个白名单机制比黑名单DenyUsers安全得多因为它是默认拒绝的思路。4.4 连接稳定性解决放着不动就断线的问题用 SSH 跑长时间任务的人都遇到过这种情况去泡了杯咖啡回来连接断了正在跑的命令也没了。这不是网络真的断了而是中间的路由设备或者防火墙为了回收资源把长时间没有数据往来的 TCP 连接记录清理了。解决办法是在服务端加这两行ClientAliveInterval 60 ClientAliveCountMax 3含义是每隔 60 秒给客户端发一个探测包连续 3 次没有回应也就是 180 秒才判定连接失效。这套参数比单纯依赖 TCP 层的 keepalive 更可靠因为它是 SSH 协议层的不会被中间设备看不见。客户端侧也可以加配置在~/.ssh/config里写Host * ServerAliveInterval 60 ServerAliveCountMax 3 TCPKeepAlive yes这里有个经验服务端和客户端两边都配上比只配一边的效果更稳。因为网络问题可能出现在任意方向双向探测能更快发现问题并维持连接。另外提一句如果用的是tmux或者screen即使连接真的断了务也不会中断这是长任务场景的标准做法强烈建议养成习惯。5. 服务管理与开机自启别重启完才发现连不上5.1 systemctl 三件套和状态判读sudo systemctl enable --now ssh这一条同时完成两件事设置开机自启enable和立即启动now。分开写就是systemctl enable ssh加systemctl start ssh。查看状态用systemctl status ssh输出里几个关键信息要会看Active: active (running)表示正在运行Loaded: enabled表示开机自启已开启Main PID是主进程号。如果状态是failed或者反复重启先看日志journalctl -u ssh -n 100 --no-pager。这个命令会列出最近 100 行日志大多数启动失败原因都能在这里看到。实时跟踪日志用journalctl -u ssh -f改配置重启的时候开着这个窗口能看到服务实际加载了什么非常有用。还有一个经常被忽略的检查点systemctl is-enabled ssh和systemctl is-active ssh。两个命令分别返回enabled/disabled和active/inactive脚本里做健康检查的时候比解析 status 输出可靠得多。5.2 配置生效方式和那些改了没反应的坑改完sshd_config之后sudo systemctl reload ssh会向主进程发 SIGHUP 信号让它重新读取配置已经建立的连接不会断。如果是改了监听端口这种涉及 socket 的改动reload 也能生效新端口会重新绑定。但有一种情况 reload 不管用如果 sshd 因为配置错误已经启动失败了reload 是没有目标的必须restart。所以准确的做法是先sshd -t验证语法再reload然后systemctl status ssh确认还是 running 状态。三步走完才算改完。提示改端口之前务必先在防火墙里把新端口放行确认新端口能连上之后再关闭旧端口的放行规则。顺序反了你可能会在某个时刻同时失去两个端口只能去物理机上救场虚拟机还能通过控制台进去物理机就麻烦了。6. 网络与防火墙连不上十有八九卡在这一层6.1 ufw 的正确放行姿势Ubuntu 自带的防火墙是 ufw默认状态是未启用但很多云主机的镜像会预启用。先看状态sudo ufw status verbose。如果显示Status: inactive那防火墙不是本次故障的原因可以排除掉。如果启用了放行 SSH 有两种写法。简单粗暴的sudo ufw allow 22/tcp。更安全的sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp只允许内网网段访问。后者的意义在于万一你的机器暴露在公网也不会被全球的扫描器天天问候。ufw 还有一个内置的应用配置sudo ufw allow OpenSSH它读取的是/etc/ufw/applications.d/openssh-server里的定义默认就是 22 端口。如果你改了端口这个配置就失效了得用上面显式指定端口的那种写法。这一点特别容易忘改了端口之后忘记同步 ufw 规则然后就开始怀疑人生。6.2 虚拟机网络的 NAT 与桥接差异这一块是虚拟机用户最集中的故障区。VMware 和 VirtualBox 的网络模式主要分 NAT 和桥接两种它们的行为完全不同。桥接模式下虚拟机会从你所在局域网的 DHCP 服务器拿一个跟宿主机同网段的独立 IP比如宿主机是 192.168.1.100虚拟机可能是 192.168.1.101。这种模式下局域网内任何一台机器都能直接访问虚拟机的 22 端口最省心。NAT 模式下虚拟机在一个由虚拟化软件创建的私有网段里比如 VMware 默认的 192.168.x.x 网段。宿主机能访问虚拟机但局域网内其他机器访问不了。如果必须让别的机器访问需要在虚拟化软件里配置端口转发把宿主机的某个端口映射到虚拟机的 22 端口。VMware 在虚拟网络编辑器里配 NAT 设置VirtualBox 在虚拟机设置的网络 - 高级 - 端口转发里配。注意从宿主机 ping 虚拟机通但 SSH 连不上这个组合几乎必然指向三种可能虚拟机的 ufw 拦了、sshd 没启动、或者你在宿主机上用了错误的 IP。排查顺序就按这个来先ss -tlnp | grep 22确认监听再sudo ufw status确认放行最后核对 IP 是不是真的对。还有一类故障和 SSH 无关但表现一样网卡没起来。VirtualBox 里如果网络适配器选了未连接虚拟机内部看ip a会发现网卡是 DOWN 状态。遇到过好几次朋友求助最后发现是虚拟化软件的勾选问题跟 Ubuntu 本身一点关系都没有。7. 密钥登录实操从生成到免密完整走一遍7.1 生成密钥对与公钥推送在客户端机器上生成密钥ssh-keygen -t ed25519 -C work-laptop-2025-t ed25519指定算法比传统的 RSA 更短更快安全性也足够。-C是备注会写进公钥末尾作用是将来在服务端的authorized_keys里能看出来哪把钥匙是谁的。执行过程中会问你保存路径和是否设置密码短语。密码短语passphrase相当于给私钥再加一层保护私钥文件泄露时没有这个短语也用不了代价是每次登录要输一次。我的建议是给自己的主力机器设置给自动化脚本用的密钥不设用文件权限和专用账户来保护。推送公钥最省事的是ssh-copy-idssh-copy-id -i ~/.ssh/id_ed25519.pub 用户名服务器IP这个命令会自动登录一次把公钥的内容追加到服务端的~/.ssh/authorized_keys文件里并且顺手把权限设对。如果服务器上没有ssh-copy-id某些精简系统就手工操作把公钥内容复制出来在服务端执行mkdir -p ~/.ssh chmod 700 ~/.ssh然后echo 公钥内容 ~/.ssh/authorized_keys最后chmod 600 ~/.ssh/authorized_keys。7.2 权限问题是密钥登录最大的坑SSH 对权限的检查严格到有点偏执这是安全设计的必然结果。要满足的条件有三个家目录不能对 group 和 other 可写chmod g-w,o-w ~.ssh目录必须是 700authorized_keys必须是 600。任何一个不满足sshd 都会静默拒绝使用这个密钥文件你在客户端看到的只是Permission denied (publickey)完全没有提示是权限问题。调试这类问题的利器是ssh -v参数加几个 v 就是几个级别的详细输出ssh -vvv能看到密钥协商的全过程。服务端对应的日志在/var/log/auth.log用sudo tail -f /var/log/auth.log实时看一边连一边看日志能直接看到 ssHD 拒绝的具体原因比如Authentication refused: bad ownership or modes for file。这个组合技比任何猜测都快。私钥的权限同样重要。如果本地私钥是 644SSH 客户端会直接拒绝使用并提示Permissions 0644 for id_ed25519 are too open改成 600 就好了。这个报错信息挺明确的不算坑但第一次遇到还是会愣一下。8. 常见故障排查实录8.1 报错信息与原因对照表大部分人遇到的问题都能归到下面这几类把报错和原因连起来看能跳过很多试错。客户端报错大概率原因排查动作Connection refusedsshd 没启动或端口不对systemctl status sshss -tlnp | grep 22Connection timed out防火墙拦截或 IP 不可达sudo ufw statusping目标ip routeNo route to host网络层不通网卡/路由问题检查虚拟网络模式、网段是否正确Permission denied (publickey)密钥未推送或权限不对ssh -vvv看auth.logHost key verification failed服务端重装过指纹变了ssh-keygen -R 目标IP清除旧记录Connection reset by peer端口被中间设备干扰或 MaxStartups 超限换端口试调大MaxStartups登录后卡住不动反向 DNS 解析慢或 GSSAPI 超时加UseDNS no、GSSAPIAuthentication no这张表里的最后一行值得展开说。登录后卡住十几秒才出现提示符这个现象在临时网络环境里特别常见原因是 sshd 在登录时尝试对客户端 IP 做反向 DNS 解析如果 DNS 服务器响应慢或者查不到就要一直等到超时。解决办法是在sshd_config里加两行UseDNS no GSSAPIAuthentication noUseDNS no直接关掉反向解析GSSAPIAuthentication no关掉 GSSAPI 认证协商这两个改完登录速度会从十几秒变成瞬间。家用网络、热点、内网隔离环境都建议加上。8.2 那些不常见但非常恶心的坑第一个是/run/sshd目录缺失。这是 sshd 启动失败的一个经典原因报错信息可能是Missing privilege separation directory: /run/sshd。/run是 tmpfs重启就清空正常情况下 systemd 的服务单元里有一行RuntimeDirectorysshd会自动创建它。但如果你的服务单元被改过或者手工启动过 sshd这个目录可能不存在。解决方法是sudo mkdir -p /run/sshd但更重要的是检查 systemd 单元文件里有没有RuntimeDirectorysshd这行从根上解决。第二个是中文乱码。SSH 登录之后ls出来的中文全是问号说明服务端没有接收客户端传来的语言环境变量。检查sshd_config里有没有AcceptEnv LANG LC_*这行没有就加上。另外确认客户端有没有通过SendEnv LANG LC_*发送以及服务端的 locale 是不是已经生成locale -a | grep zh_CN看有没有中文语言包没有的话用sudo locale-gen zh_CN.UTF-8生成。第三个是配置被 drop-in 覆盖。前面提过一次这里再强调因为它的表现形式非常诡异你明明在主文件里改了参数reload 之后systemctl status也显示正常但行为就是没变。排查方法是sudo sshd -T | grep 参数名这个命令会输出 sshd 实际生效的完整配置比看文件靠谱得多。如果输出的值和你改的不一样那就是被别的地方覆盖了grep -r 参数名 /etc/ssh/全局搜一遍就能找到真凶。第四个是端口冲突。改了端口之后启动失败日志里写着Address already in use说明这个端口被别的程序占了。用sudo ss -tlnp | grep 端口号找出占用者换个端口或者停掉那个程序。9. 装完之后的安全加固与日常用法9.1 一份可以照着做的加固清单刚才把 SSH Server 跑起来了但如果这台机器有任何暴露到公网的可能下面这几件事最好都做掉。第一禁用密码登录只用密钥。这是收益最大的一步做完之后暴力破解基本上就没戏了。在sshd_config.d/下建一个99-hardening.conf写PasswordAuthentication no和KbdInteractiveAuthentication noreload 生效。改之前务必确认密钥登录已经能用了不然就是自己把自己锁在门外。第二限制可登录用户。AllowUsers deploy admin只允许这两个用户登录其他系统用户即使有 shell 也进不来。这个白名单机制能防御一类攻击攻击者通过某个服务的漏洞创建了一个低权限用户然后试图用它登录 SSH。第三改默认端口并只监听内网。前面已经讲过两个动作配合起来公网扫描器基本上就找不到你了。第四装上 fail2ban。它会监控auth.log发现某个 IP 连续失败登录达到阈值就自动加防火墙规则封掉一段时间。安装很简单sudo apt install fail2ban默认配置对 SSH 就已经生效了。想要自定义阈值就复制一份jail.conf成jail.local再改别直接改jail.conf升级的时候会被覆盖。第五定期看一眼登录记录。last命令看成功登录sudo lastb看失败登录sudo grep Failed password /var/log/auth.log | wc -l统计失败次数。养成偶尔看一眼的习惯能及早发现异常。9.2 日常高频用法不只是登录SSH 装好之后很多时候你根本不需要真的登录进去就能完成任务。传文件用scp或sftp。scp -r ./dist deployserver:/var/www/一条命令把整个目录推上去。不过文件多的时候 scp 效率不高用rsync -avz -e ssh ./project/ deployserver:/srv/project/更好它支持增量传输第二次同步只传改动过的文件速度快一个数量级。-z是压缩传输在文本类文件上效果明显。本地端口转发是开发场景的利器。远程机器上跑了个只在本地监听的服务比如 MySQL 只绑在 127.0.0.1:3306你在本地想用图形客户端连它直接连是连不上的。用这条命令ssh -N -L 13306:127.0.0.1:3306 deployserver它把远程的 3306 映射到你本地的 13306然后本地客户端连 127.0.0.1:13306 就相当于连到了远程的数据库。-N表示不执行远程命令只做转发。同样的套路可以用于访问远程的 Web 服务、Redis、各类管理面板非常实用。远程执行单条命令也是我常用的一招。ssh server df -h直接看磁盘ssh server systemctl restart nginx重启服务ssh server tail -n 100 /var/log/app.log看日志尾部。这些操作不需要进入交互式 shell在脚本里写起来也方便配合for循环可以批量管理多台机器。sshfs是另一个值得知道的工具sudo apt install sshfs之后可以把远程目录直接挂载成本地目录用文件管理器或者编辑器直接打开远程文件改完保存就同步到远端了。写配置文件、调代码的时候比来回 scp 舒服得多。10. 我踩过的几个坑和后来总结的习惯回头说说我在这件事上真正花过时间的地方希望能帮你少走点弯路。最大的坑是改了配置之后连不上而且没有物理访问途径。这个教训让我养成了一个雷打不动的习惯改 SSH 配置的时候永远保持当前这个连接开着不动然后在另一个终端窗口里用新连接测试。新连接能进去才关掉旧窗口。这样即使配置有问题你手上那条老连接还在可以立刻改回来。这个习惯救过我很多次尤其是在远程服务器上。第二个是密钥管理。一开始我把所有机器的密钥都用同一对方便是方便但后来意识到这等于一把钥匙开所有锁任何一台机器的私钥泄露所有机器都沦陷。现在的做法是不同的用途、不同的信任级别用不同的密钥靠~/.ssh/config里的IdentityFile区分Host prod-* User deploy IdentityFile ~/.ssh/id_ed25519_prod IdentitiesOnly yes Host dev-* User dev IdentityFile ~/.ssh/id_ed25519_devIdentitiesOnly yes这行很重要它让 SSH 只用指定的密钥不去挨个尝试~/.ssh下的所有密钥。服务器多的时候不加这个参数一次登录可能要试十几把钥匙服务器端的MaxAuthTries很容易就被打到表现就是莫名其妙的Too many authentication failures。第三个是关于稳定这个词的误解。很多人以为 SSH 断线是网络不稳实际上九成以上是长时间空闲被中间设备清理了会话。解决办法前面讲过了服务端客户端都配上心跳探测再配合 tmux 跑长任务基本就告别断线焦虑了。第四个是小细节known_hosts会越来越大。频繁连不同机器、重装系统、换 IP都会往里加新记录偶尔清理一下没坏处。更重要的是如果你的服务端重装了客户端会报Host key verification failed并拒绝连接这是设计好的安全机制防止中间人攻击。确认是自己重装的用ssh-keygen -R 目标IP删掉旧记录再连就行别去关掉StrictHostKeyChecking那个开关关掉就等于放弃了对服务端身份的校验。最后分享一个我很喜欢的用法把常用的排查命令封成一个小脚本通过 SSH 一次跑完。比如ssh server uptime; df -h /; free -m; ss -tlnp | grep :22一条命令返回负载、磁盘、内存和端口监听状态比一条条敲快得多。这类组合命令在写巡检脚本、做故障快照的时候特别顺手也算是对得起当初装 SSH Server 花的那点时间。
返回列表