让 Agent 稳定管理多台服务器:SSH 密钥、连接复用与 Ansible
整理日期:2026-09-14。来源:当天可见聊天摘要;原理说明为整理时补充,非完整对话逐字稿。未取得的设备参数与未验证的结论明确保留为待核实。
目标
本地 Agent 频繁访问 ascend-43 等服务器,希望少输密码、减少重复登录,并避免登录限流。
需要分开解决认证、连接复用和批量运维。
三种机制解决三个问题
SSH 密钥认证减少密码交互;ControlMaster 复用已认证连接;Ansible 用主机清单和 Playbook 组织多机任务。
免密不会自动减少新建连接,也不保证不触发限流。复用仍受服务端会话数量、网络策略等约束。
Linux、macOS 或 WSL 的复用配置示例
在运行 Agent 的同一环境中创建控制套接字目录:
mkdir -p ~/.ssh/control
chmod 700 ~/.ssh/control
把下面配置合并到现有主机条目,替换示例主机和用户名:
Host ascend-43
HostName SERVER_ADDRESS
User YOUR_USER
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
ControlMaster auto
ControlPath ~/.ssh/control/%C
ControlPersist 30m
ServerAliveInterval 30
ServerAliveCountMax 3
ControlMaster 允许复用,ControlPath 指定本地套接字,ControlPersist 控制会话结束后的连接保留。先人工完成首次主机身份确认与必要认证。上述配置能力以实际 OpenSSH 客户端支持为准;Windows 原生客户端不能直接假定与 WSL 一样支持复用。ssh_config 官方手册
ssh -MNf ascend-43 的含义
-M 建立可共享的主连接,-N 不执行远端命令,-f 在认证后进入后台。需配合 ControlPath 等配置才能让后续调用找到它。
ssh -MNf ascend-43
ssh -O check ascend-43
ssh ascend-43 'hostname'
已有 ControlMaster auto 时,普通首次连接也可自动建立主连接,不需要每条命令都 -MNf。连接超时、断网或重启后需要重新建立。ssh 官方手册
复用只保留 SSH 传输连接,不保留每次远端 shell 的工作目录或 export。每条命令需明确工作目录与环境;长期交互任务可使用独立持久会话机制。
密钥、ssh-agent 与影响范围
使用个人密钥,并将公钥追加到自己的远端 authorized_keys,不覆盖他人条目。带口令的私钥可由 ssh-agent 解锁管理;ssh-agent 与 AI Agent 是两个不同概念。
只修改自己的客户端配置和自己账号的密钥,通常不改变他人登录方式;修改系统级 sshd 配置则可能影响所有用户。
sshpass 适合什么情况
sshpass 用程序应答密码提示,本质仍是密码认证;它不自动提供连接复用。不能把密码直接写进 Agent 提示词、仓库或命令历史。已有密钥与复用路径时,通常无需额外引入它。
Ansible 是什么
Ansible 是从控制节点管理目标机器的自动化工具,通常无需常驻管理代理。它组织主机清单、配置管理、部署与批量命令;很多 Linux 模块需要目标机具备 Python。Ansible 官方文档
例如将机器归入 ascend 组后,可先使用 ping 模块检查连接与模块执行,再将重复环境检查写成 Playbook。Ansible 的 ping 不是 ICMP ping。
对于当前工作方式,先统一 SSH 别名、认证和复用;等同一操作反复应用到多台服务器时,再用 Ansible 沉淀流程。
**实测状态:**以上为配置笔记,本次未连接服务器或修改任何 SSH 配置。
合并补充:关闭主连接与长任务生命周期
ssh ascend-43 'npu-smi info'
ssh -O exit ascend-43
exit 结束主连接,可能影响正在复用的会话。主连接断开后需要重建,不是首次认证后永久有效。
若多人共用远端账号,应按共享权限理解密钥影响范围。连接是否存活、shell 状态是否保留、推理任务是否持续,是三个独立问题;长服务应由服务管理器、容器编排或合适的持久终端管理。
多主机可用 Host ascend-* 共享复用设置,同时保留各主机独立的地址和账号。Ansible 实践资料:官方 inventory 入门。
2026-09-16 补录:把远端 8077 转到本地与 API 验证
来源:9 月 15 日 11—12 点的提问摘录,未取得完整原始回答。
在你的本地电脑执行:
ssh -N -L 127.0.0.1:8077:127.0.0.1:8077 -o ExitOnForwardFailure=yes ascend-35
左侧 127.0.0.1:8077 是本地监听;右侧 127.0.0.1:8077 是从 ascend-35 看见的目标服务。该方向正是“本地访问远端 8077”,无需改成 -R。-N 不执行远端命令,前台保持运行是正常现象;登录横幅不证明转发成功或失败。
ExitOnForwardFailure 检查转发监听等建立失败,不保证之后每次都能连上目标 API。SSH 手册
可先在远端确认服务,再从本地请求:
curl --fail http://127.0.0.1:8077/v1/models
若服务在容器内,远端宿主机的 127.0.0.1 不自动等于容器的 127.0.0.1,需要端口映射或正确目标地址。本地端口冲突时可将左侧改成 18077。
completions 与 chat/completions
/v1/completions 接收 prompt,适合文本续写;/v1/chat/completions 接收 messages,由服务端按聊天模板组织模型输入。两者最终都调用模型生成,但相同自然语言字符串不代表实际输入 token 一致。vLLM 在线服务文档
curl --fail http://127.0.0.1:8077/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"glm","messages":[{"role":"user","content":"请用三句话解释大语言模型。"}],"max_tokens":256,"temperature":0}'
model 应以 /v1/models 返回的服务名称为准。聊天模型评测优先核对 chat template;输出接口连通不等于模型精度验收通过。Shell 续行反斜杠后不能有空格,避免把残缺命令误判为服务错误。
2026-09-16 增量:Windows 上给 Agent 使用 Plink 连接共享
问题起点:Windows 上希望减少重复登录请求;你并未要求额外封装层或新增安全策略。这里直接记录 PuTTY/Plink 原生路径。
在 PuTTY 保存会话 ascend-35,确认地址、用户名及连接共享设置,然后在一个终端建立并保持上游连接:
plink -N -share -load "ascend-35"
后续 Agent 的命令可以使用:
plink -batch -share -load "ascend-35" "hostname"
plink -shareexists -load "ascend-35"
-shareexists 仅检查是否存在可共享上游,不建立新连接;返回 0 表示存在,非 0 表示不存在。-batch 避免自动化过程等待交互,但不等于“绝不发起新登录”。Plink 官方手册
连接共享设置、同一 Windows 用户上下文及实际客户端版本必须匹配。普通 -share 调用在没有上游时可能成为新上游;若要求上游不存在就立即失败,应采用对应客户端支持的仅下游配置,并验证日志。先检查再调用也存在连接恰好断开的时间差,不能把两步检查说成严格保证。
不必为了日常复用强制包一层 wrapper。只有需要集中重连、互斥或严格失败语义时,才另行设计连接策略。本次仅整理,未改你的电脑或服务器配置;复用成功应以 Plink 日志和服务端登录记录核验。