SSH 远端卡死时如何收尾临时密钥
什么情况下会撞上它
典型场景:在远程主机做临时操作,本地生成临时 SSH 密钥,公钥追加到远端 ~/.ssh/authorized_keys,私钥放本地临时目录。操作中途远端内存耗尽严重换页,SSH 能连上但命令不返回或超时。此时需收尾:删临时密钥、清 /tmp 安装包、终止残留进程,但收尾本身也要走 SSH。
判断依据:远端命令连续两三次超时、且 ssh -v 显示认证通过但卡在执行阶段,就按“远端不可用”处理,先做本地清理,远端留待恢复后补。
为什么会这样
SSH 认证和执行是两个阶段。认证只做密钥交换和签名校验,开销很小;执行要 fork 进程、加载 shell、读磁盘,内存不足时会被拖到几乎无响应。所以“能连上”不代表“能执行命令”。sed -i、pkill 都需要远端真正跑起来,反复重试只会加重负载。
另一个易忽略点:私钥一旦出现在日志、终端回显、聊天窗口或临时文件里,就应视为已泄露,无论是否“损坏”。清理目标是确认没有副本留存,而非让它不可用。
怎么做
第一步:先做本地清理
远端不可用时,本地清理不依赖网络,优先做。
rm -rf /path/to/app/.tmp-ssh
grep -rl "BEGIN OPENSSH PRIVATE KEY" /path/to/app /tmp 2>/dev/null
按内容特征搜索,不要只按文件名。命中后逐个确认:早于本次操作时间的,通常是源码里的测试夹具,可排除。
第二步:确认私钥已不可用
本地私钥删除后,即使远端 authorized_keys 还有对应公钥也无法登录。检查本地是否还有同名或同内容文件即可。
第三步:远端恢复后补做清理
等内存压力缓解,或通过控制台重启、进入救援模式后执行:
sed -i '/temp-install-key/d' ~/.ssh/authorized_keys
grep -c temp-install-key ~/.ssh/authorized_keys # 期望 0
sudo pkill -9 -f "npm i -g"
rm -f /tmp/node-*.tar.*
添加公钥时就加可识别注释(ssh-keygen -C temp-install-key),是让这一步可靠的前提;没有注释只能比对指纹,成本高得多。
第四步:处理装了一半的软件
command -v your-app
ls /usr/local/lib/node_modules
没装上就不用管;装上了但不想要,按安装方式反向删除:包管理器装的用包管理器卸,手工解压到 /usr/local 的按文件清单删。
怎么确认成了
- 本地:
grep无命中,或命中项经核对为无关文件。 - 远端:
grep -c返回 0;ps aux | grep无残留安装进程;/tmp下无安装包。 - 登录面:用原临时密钥连接应被拒绝。
哪步失败就停在哪步:远端超时说明主机未恢复,改用控制台;grep -c 不为 0 说明注释写错或有多处添加,需逐行核对。
边界与代价
这套流程假设你能通过控制台或重启接触主机。纯云主机没有串口时,只能等或提工单。
私钥内容一旦出现在任何持久化位置(日志、剪贴板历史、聊天记录),应轮换相关口令,而不只是删文件;临时密钥应始终带注释、限定有效期,并在操作前就想好清理命令。若该口令在别处也使用,同样建议更换——密钥失效不代表泄露的口令失效。