一次ssh排错经历
Frank Zhang
- One minute read - 65 wordsTL;DR
本文介绍了SSH连接macOS时,如何进行多方面排错。
TL;DR
本文介绍了在macOS上使用cpolar作为SSH内网穿透方案时,由于多方面因素导致无法实现远程连接的排错方案。
问题背景
由于日常开发需要,我在主用的MacBook上开启了远程登录,并且通过cpolar实现了内网穿透,系统自动监控远程连接地址和端口的变化,并在适用时通过手机端bark发送连接端口变化的通知。
但是这几天我遇到了一件比较奇怪的事:即使在iOS端termius配置好了“正确的”远程登录信息,连接时却一直提示无法建立连接(Connection could not be established),我在macOS上通过脚本查看了最新的登录信息,发现并没有填错,于是,就有了这个排查过程。
核心结论
SSH连接不是只有“账号密码对不对”,而是至少包含了4层:sshd是否启动、cpolar隧道是否还活着、脚本读到的是不是最新的端口、客户端是否缓存了旧的host key。
过程与拆解
1. 现象
用目前这套cpolar+termius的远程登录方案已经很长时间了,之前一直没什么问题,在iPhone上的termius中填入正确的认证信息后,直接就能连接上(前几天清明节的时候好像都连接过,也没什么问题)。由于用的是cpolar免费账户,远程登录地址和端口经常变化,所以我还在macOS上部署了自动化脚本,实时监控/tmp/cpolar.log中的地址端口变化,并在有变动的时候通过手机端bark发送通知,我这里点击那条通知,就能复制完整的地址+端口,填入termius,马上就能登录。
结果这几天老出现手机上无法使用termius进行SSH连接的问题,上一次是在昨天晚上,那时候我还以为是电脑休眠了,导致连接默认被拒绝(虽然之前休眠的时候也连接得上),于是就想着第二天把电脑从休眠中唤醒后再试试。今天早上,电脑唤醒后,发现还是连接不上,报的还是同一个错,于是就感觉不对了,并且开始和GPT一起排查。
2. 原因
经过一段时间的排查,发现有这几个问题:
1.远程登录服务没启动
2.cpolar变更了登录端口,但是并没有被自动化脚本捕获,推送到手机上
3.手动运行的cpolar-addr(这是我创建的查看cpolar最新连接信息的脚本名称)未能获取最新端口信息
可能是前几天重启过电脑,导致ssh服务被关闭,所以昨晚和今天早上都无法远程连接(即使那时候用的登录信息是正确的),而启动sshd服务后,又因为cpolar连接信息被更新,自动化脚本还没有检查到这个更新,我用旧的端口连接了macOS,又发生了无法连接的问题。
排查清楚后,解决方案就很简单了,下面简单介绍一下。
3. 解决方案 / 方法
首先需要运行这条命令检查sshd是否真的在监听本机端口22
nc -vz 127.0.0.1 22
如果返回"Connection to 127.0.0.1 port 22 [tcp/ssh] succeeded!",那就说明22端口(SSH默认端口)处于监听状态了。
如果sshd并没有启动,就需要运行这个命令启动那个服务:
sudo launchctl kickstart -k system/com.openssh.sshd
输入后,提示输入密码,把密码输入进去就启动sshd服务了。
启动sshd成功后,就需要调查最新的连接端口是否有变化,比较保险的方案还是自己用文本编辑器(比如vim)打开/tmp/cpolar.log,搜索established,应该能找到这样的一条日志:
time="2026-04-09T10:41:11+08:00" level=info msg="[:tunnel server module] Tunnel established at tcp://37.tcp.cpolar.top:12036"
tcp后面的那个"37.tmp.cpolar.top"就是远程登录地址,12036就是连接端口,用户名就是系统设置顶部的那个名称(或者可以在终端中运行whoami获取),密码就是锁屏密码。
输入正确的远程连接信息后,就能连接了。
4. 为什么这样做有效
只有确保了sshd已启动,并且正在监听本机22端口、cpolar隧道还活着、将最新的远程连接信息填入了SSH客户端,才能从源头到末尾确保远程登录服务正常。
最后
如果你也在SSH连接过程中遇到类似的问题,可以用这套方法检查一下(Windows平台需要更换部分命令和工具,不过思路是相通的)。