
Conning
io.github.EranYonai由 GitHub 账号 EranYonai 发布v0.6.5更新于 Oct 29, 2026
Run commands on your remote test machines over SSH without the agent ever seeing a secret.
概览
本地 SSH 控制器,让助手在不接触密钥的情况下列出目标、执行命令、读取作业输出并在远程测试机上复制文件。
- 可以做什么
- 列出已配置的 SSH 目标及其系统、shell、主机、用户、标签和审批模式,绝不返回密钥
- 在单个目标、目标列表或某个标签上执行命令或 argv,先返回退出码,长任务返回作业 id
- 通过长轮询读取作业输出、分页查看已保存输出,或读取远程文件
- 在本地路径与目标之间复制文件,并用 sha256 校验
- 白名单之外的命令会等待人工批准,可在助手客户端、conn watch 或终端中答复
- 适用场景
- 适合需要让助手通过 SSH 操作远程测试机或实验机、运行长任务并取回输出、或传输文件的场景,同时由你掌握凭据并批准有风险的操作。
- 运行要求
- 以 stdio 在本地运行;可用 uv tool install 或 pipx 安装,也可用 uvx conning mcp 直接运行,或使用 Docker 镜像。目标机需开放入站 SSH;Windows 目标需要 OpenSSH 和 PowerShell 7。密钥来自系统钥匙串、op:// 引用、env: 引用或 ssh-agent。添加和批准目标、把目标切换为 auto 模式需要人工终端。
安装
在 SourceWeft 中
- 打开 控制台中的 Conning,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
Conning
[Handler, the Conning mascot: a friendly cartoon glove working puppet strings on three lab VMs]
A light, local SSH controller for humans and agents. Conning is one small CLI and MCP server on your own machine. It runs commands, long jobs and file copies on your test machines over plain OpenSSH. You drive it from a terminal; your agent (Claude Code, Codex, Cursor...) gets the same four commands as MCP tools, with identical output. Conning holds the keys, so the agent never sees a password, and you approve anything risky.
Status: early (0.6). Linux, macOS and Windows targets work, with long jobs, transfers, jump hosts and approvals. See docs/design.md for every decision so far.
What it is
- Light. One Python package and no daemon: the MCP server runs on stdio when your agent starts it. Four tools cost about 1k tokens a turn. Results lead with the exit code and are capped at 8 KB by default, with a handle to page the rest; fan-out to many targets collapses identical results.
- Local. It runs next to you and your agent. Targets only need inbound SSH, and nothing gets
installed on them. Secrets stay where they are (OS keychain,
op://, ssh-agent): the target file holds references, and no tool ever returns a secret. - SSH. Plain OpenSSH underneath, never your
~/.ssh/config: a generated config per target, pinned host keys, forwarding off, jump hosts. Windows targets need OpenSSH and PowerShell 7. - For humans and agents. Each target has a mode,
askorauto. Inask, read-only commands and your allow rules run, and anything else waits for you; "always allow" remembers two words, sosystemctl statusnever lets throughsystemctl stop. Only you grant trust: in the agent client's prompt, inconn watchor at your terminal.
Install
For Tab completion that reads the target (its files, commands and shell history), run
conn completion install once; it adds one line to your bash, zsh or fish rc file, and conn doctor
reminds you if it's missing. Set history = false on a target to keep its shell history out (D53).
The MCP server needs no install at all:
Or run the server in Docker
The image carries Python, the OpenSSH client and Conning, and nothing else. Targets, pinned host
keys and job output live on the /conning volume, and conn runs as that folder's owner, so files it
writes there stay yours on the host. On Docker Desktop for Mac, forward the agent with
-v /run/host-services/ssh-auth.sock:/ssh-agent instead. Two things stay on your machine (D46):
- Approving.
conn targets add,conn approve,conn allowand turning onautoneed your terminal. Install the CLI on the host and point it at the same folder:CONNING_HOME=~/.config/conning conn approve a:1. Approving in the agent client works from the container as usual. - Secrets. The OS keychain is not reachable from a container, so use
env:orop://references, or forward your ssh-agent as above and use a key.docker run --rm ... conning doctorchecks the rest.
Targets on a lab LAN or VPN need --network host (Linux) or a route the container can use.
The agent's four tools
Agents without MCP can use the same commands through the conn CLI; the output is identical.
For agents: CLI reference
This block is generated by conn help --markdown, so you don't need to call --help. A test keeps it
in sync with the code.
A target is one login on one machine. To use the same machine as another user, add it again:
conn targets add lab-tester --like lab --user tester copies the host, port, OS and tags and asks for the new
user's password. conn targets shows which user each target uses.
A target behind a bastion names it as its jump host: add the bastion as a target first, then
conn targets add lab --host 10.0.0.5 --user tester --jump gw. Every hop gets its own login and its own pinned
host key, and conn targets import keeps a ProxyJump to another host it imports. The bastion is a target the
agent can see too; in ask mode it can only run read-only commands there without you.
A target you add with conn targets add from an agent session is saved as pending. It does nothing until
the human runs conn approve <name>, which shows the host, the pinned host-key fingerprint and where
the secret comes from.
A command outside a target's allowlist returns status=pending_approval id=a:<id>, and a desktop
notification tells the human. They answer in one of three places (allow once, always allow its first
two words, or deny), and the agent picks up the result with read a:<id>:
- In the agent client: any MCP client that supports elicitation shows the question before the
command is queued, and an approved command runs in the same call. Clients without it fall back to
the two below. If a client would answer such prompts by itself instead of asking you, run the server
as
conn mcp --no-approve-in-client. - In
conn watch, which also shows every command and its output as it happens. - With
conn approve a:<id>in any terminal. When you runconn runyourself at a terminal, it just asks you there and prints the result.
read a:<id> long-polls only while a conn watch is open. With nobody watching, it returns at once
with nobody is watching: ask the user to run conn approve a:<id>, so the agent asks you instead of
waiting out its timeout for an answer no one was asked for.
Read-only commands such as uname, hostname, df, ps, ls, ip addr, systemctl status and
journalctl run without asking on every target; each is checked so its changing forms (hostname x,
ip addr add) still ask, and safe = false in a target's entry turns the list off.
conn allow <target> make test lets another command run without asking from then on; conn deny
takes it back. Every command, answer and rule change lands in a hash-chained audit log, and
conn doctor checks your setup when something doesn't work.
Safety model
- No tool returns a secret, adds a live target or changes policy.
- Secrets travel over stdin or the SSH channel's env, never argv. Output is redacted before it is saved.
- Remote output is marked untrusted. Shell wrappers (
sh -c,python -c,sudo...) and shell syntax (;,|,$(...)) always ask. conn mcp installalso denies the agent rawssh/scpandconn ssh, so it can't go around Conning (pi has no permission rules, so there it only adds the server).- The audit log is hash-chained. It runs as your user, so it is tamper-evident, not tamper-proof.
Development
The end-to-end tests drive the real conn and MCP server against a throwaway local sshd (Linux, root
to start it; CI's e2e job does this on every push):
After changing the CLI, refresh the README block with uv run conn help --markdown.
Docs
- docs/design.md: the design and every decision, with its status.
- docs/blog.html: the development blog, from the first idea to today.
- docs/manual-test.md: a ten-minute check of every feature against a throwaway target.
- docs/field-test.md: using it for real work, and how to report what gets in the way.
Why Python
Python is the easiest thing to install on a developer's machine and the language most of the AI
tooling around it is written in. uvx conning mcp runs with no prior install, pip/pipx/uv
are already there, and the MCP SDK, keychain bindings and agent clients all live in the same
ecosystem. Go or Rust would give a single binary, but Conning drives the real OpenSSH binary and
mostly waits on the network, so their speed buys little here.
License
来源:README.md,提交 f9da2d0
工具
0版本历史
5- v0.6.5最新Oct 29, 2026
- v0.6.4Oct 20, 2026
- v0.6.3Oct 19, 2026
- v0.6.2Oct 17, 2026
- v0.6.0Oct 17, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分