Netcatty (Netcatty Mobile)
项目信息与仓库导航
- Netcatty 桌面端仓库:https://github.com/binaricat/Netcatty
- Netcatty 桌面端官网:https://netcatty.app
- Netcatty Mobile 移动端仓库:https://github.com/kmh1145/Netcatty-mobile
- 移动端最新 APK 下载:https://github.com/kmh1145/Netcatty-mobile/releases/latest
在日常服务器管理与远程运维中,SSH 客户端是我们每天打开频率最高的生产力工具。传统终端工具往往存在界面老旧、移动端体验割裂、跨设备配置同步复杂等痛点。
近期开源社区推出的 Netcatty 桌面端及其专属原生移动端 Netcatty Mobile,以极具现代感的 Radix UI 原子设计、原生触屏辅助按键、画中画小窗后台保活,以及零服务器维护成本的端到端加密云同步(E2EE),成为跨端 SSH 远程工作台的新标杆。
本文将结合官方中文全景特性与移动端重构成果,系统梳理 Netcatty 桌面与移动端的全套功能、钥匙串模型、动态代码片段、原生免改源码公钥一键注入脚本,以及自建云同步配置 SOP,作为日常运维速查与实战手册。

一、桌面端旗舰:Netcatty 核心架构与多视图解析
Netcatty 桌面端基于 Electron 40 + React 19 + TypeScript + Radix UI + Tailwind CSS 4 + Monaco Editor + xterm.js 5 技术栈构建,将原本分散在各独立工具中的功能深度整合为一体化工作台。
┌──────────────────────────────────────────────────────────┐
│ Netcatty Desktop │
├───────────────┬──────────────────────────┬───────────────┤
│ 主机与保险库 │ 多标签分屏终端 │ SFTP 资源树 │
│ (Vault 视图) │ (xterm.js + 辅助命令) │ & Monaco 编辑│
├───────────────┴──────────────────────────┴───────────────┤
│ 内置 Catty AI 运维助手 & 本地/动态端口转发 │
└──────────────────────────────────────────────────────────┘
1. 现代化原子设计与双主题质感
主界面围绕长期 SSH 驻留工作流设计,彻底抛弃传统终端的死板边框。支持深色护眼模式与浅色高对比模式自由切换,兼具科技感与视觉舒适度。
| 深色网格工作台 | 浅色高雅工作台 |
|---|---|
![]() | ![]() |
2. Vault 主机保险库:三大视图自由调度
- 网格视图(Grid):全局卡片式平铺,自动识别并展示 Linux 发行版(Ubuntu、Debian、CentOS、Alpine、Arch 等)或 FreeBSD/macOS 官方图标;
- 列表视图(List):紧凑高密度排版,配合顶部即时搜索,适合大批量主机快速筛选;
- 树形视图(Tree):按业务、机房或环境多层级展开,层级导航井井有条。
| 紧凑列表筛选视图 | 树形分组层级导航 |
|---|---|
![]() | ![]() |
3. 多窗分屏与终端工作区
终端窗口支持水平与垂直无限制分屏(Split Terminal)。在处理「左侧观察服务部署、右上查看实时访问日志、右下执行诊断命令」等多任务场景时,无需在多个窗口之间反复切换。

4. 内置 Monaco 专业代码与配置编辑器
浏览 SFTP 远程文件时,直接集成 VS Code 同款 Monaco Editor,支持语法高亮、代码折叠、正则查找替换与即时保存回传,修改远程 nginx.conf、docker-compose.yml 极为丝滑。
二、内置 Catty AI 运维助手实战
Netcatty 原生内置了 Catty Agent AI 运维助手,支持自然语言跨主机操作、报错诊断与集群任务编排。
1. 单主机:智能状态诊断与日志排错
当服务异常或命令报错时,直接向 Catty Agent 发问,它会自动执行探测命令、分析输出并给出结构化的诊断结论。

2. 多主机:跨节点 Docker Swarm 集群编排
Catty Agent 可在一次对话中跨多台远程主机进行协同编排。例如编排 Docker Swarm 集群时,它会自动完成初始化、令牌分发与节点加入,全程无需手动在两台机器间复制 Token。

三、钥匙串(Keychain)与统一身份凭据模型
Netcatty 采用了清晰解耦的钥匙串架构,将「密钥」与「登录凭据」独立于具体主机,实现一次录入、多处复用。
┌──────────────────────────────────────────────────────────┐
│ 钥匙串 (Keychain) │
├────────────────────────────┬─────────────────────────────┤
│ SSHKey 密钥库 │ Identity 身份凭据库 │
│ • 独立私钥 / 公钥 / 证书 │ • 标签 / 用户名 / 认证方式│
│ • Passphrase 本地安全存储 │ • 独立密码 / 关联 KeyId │
└─────────────┬──────────────┴──────────────┬──────────────┘
│ 批量绑定关联 │ 批量绑定关联
▼ ▼
┌──────────────────────────────────────────────────────────┐
│ 主机清单 (Hosts Inventory) │
│ 主机 A / 主机 B / 主机 C... │
└──────────────────────────────────────────────────────────┘
SSHKey(独立密钥库):独立管理 RSA、ECDSA、Ed25519 等私钥、公钥与证书,安全隔离存放;Identity(独立身份与密码库):- 包含:
Label(标签)+Username(用户名)+AuthMethod(认证方式)+Password(密码)或关联KeyId; - 批量复用:可以创建一个名为「生产环境统一 Root」的 Identity,配置主机时勾选绑定该凭据;后续统一修改密码时,只需在钥匙串中改动一次,所有关联主机全部自动同步生效。
- 包含:
四、代码片段(Snippets)与自动化脚本全景实战
Netcatty 将原本简单的「快捷命令」扩展为两大模式:常规命令片段(Command Snippet) 与 高级自动化脚本(Automation Script)。两者在底层机制、交互维度与适用场景上有着清晰的分工。
1. 核心架构与两大模式选型对比
| 维度 | 常规命令片段(Command Snippet) | 高级自动化脚本(Automation Script) |
|---|---|---|
| 底层实现 | 纯 Shell / Bash 文本模板替换 | Netcatty 内置 Node.js 异步 JavaScript 引擎 |
| 代码门槛 | 零门槛,平时怎么敲命令就怎么写 | 需要基础 async/await 语法,调用 nct.* API |
| 变量交互 | 支持轻量弹窗输入框 {{var:default}} | 支持 confirm 确认框、prompt、select、form 多表单 |
| 会话自感知 | ❌ 无法感知当前主机名、用户与网络状态 | ✅ 完全自感知,直接读取 nct.session.* 实时元数据 |
| 终端双向控制 | ❌ 单向注入(仅将字符敲入终端) | ✅ 双向闭环(等待提示符、等特定输出文本、读屏) |
| 剪贴板机制 | 弹窗自动聚焦,按 Ctrl+V 即时核对防误粘 | 沙箱安全隔离,通过弹窗输入框按 Ctrl+V 粘贴 |
| 触发方式 | 仅支持手动点击运行 | 支持 手动、连接后自动 (onConnect)、特定日志触发 (onOutput) |
模式选型速查建议:
- 优先使用常规命令片段:单行维护命令、环境体检、Docker 镜像清理、或仅需临时输入 1~2 个参数(如端口号、容器名、固定 Token + 动态域名)的常规 Shell 场景;
- 优先使用高级自动化脚本:需根据当前主机/用户动态调整逻辑(如自动读取
nct.session.username区分root与普通用户路径)、高危破坏性操作(如删除公钥、停机、清库,必须弹窗二次确认防误触)、需要等待命令跑完再执行下一步、或者连上跳板机后自动导航交互。
2. 常规命令片段:模板变量语法与运行机制
在普通命令片段中,Netcatty 通过 {{...}} 语法提供零门槛参数注入与弹窗交互。
(1) 支持的 2 种变量语法
- 必填变量:
{{变量名}}- 示例:
{{domain}}、{{container_name}} - 说明:点击执行时弹出输入框;若内容为空,输入框会标红警告并阻止运行,防止危险参数空传。
- 示例:
- 带默认值变量:
{{变量名:默认值}}- 示例:
{{user:root}}、{{port:2222}}、{{scan_dir:/var}} - 说明:冒号后为缺省值,弹窗时已自动填好;直接按回车(
Enter)即使用默认值,亦可手工改写。
- 示例:
(2) 交互与底层智能特性
- 实时命令预览(Preview):在输入框键入内容的同时,下方实时渲染最终拼装出的完整命令,所见即所得;
- 本地持久化记忆:每个片段输入过的数值会自动保存在本地
localStorage,下次点击自动预填上次输入,免除重复输入; - 同名变量合并:一行命令多次出现
{{ip}}时只弹一次输入框,全局自动替换; - Go Template 智能避让:底层内置语法树解析,Docker/K8s 的
docker inspect --format '{{.State.Running}}'或{{range .items}}绝不会被误当成变量弹窗。
3. 高级自动化脚本:会话上下文与交互 API
新建片段时将类型选为 Script(自动化脚本),即可在 Node.js 异步沙箱中调度强大的 nct 全局对象。
(1) 会话只读元数据(Session Context)
无需用户手动输入,脚本可在运行时自动读取当前连接的实时状态:
nct.session.username:当前 SSH 登录用户名(如 root、ubuntu、debian);nct.session.hostname:当前连接的主机 IP 地址或域名;nct.session.name:当前主机在 Netcatty 资产库中的备注名称;nct.session.connected:当前终端会话是否正常连通(布尔值)。
(2) 对话框交互 API(Dialog API)
await nct.dialog.prompt(msg, defaultVal?):弹出单行文本输入框;await nct.dialog.confirm(msg):弹出确认/取消对话框(返回true/false),高危操作防误触必备;await nct.dialog.select(label, options):弹出单选下拉列表;await nct.dialog.form({ fields: [...] }):弹出高级表单(支持 select/radio/checkbox/textarea/number 等)。
(3) 终端双向调度(Screen API)
await nct.screen.waitForPrompt(timeoutMs?):等待终端命令提示符出现(#或$);await nct.screen.sendLine(command):向终端发送命令并回车;await nct.screen.waitForText(text, timeoutMs?):等待终端出现指定字符串;await nct.screen.getText():抓取当前终端屏幕缓冲区文本;nct.log(msg):在右侧控制台输出调试日志。
4. 生产级公钥一键运维实战(双用户 root + ubuntu 并发与防误触拦截)
管理多台服务器的 authorized_keys 是日常高频场景。许多云服务器默认存在 root 与特定发行版初始账号(如 ubuntu、debian 等)。以下脚本内嵌 4 重容错与防重复保障:
- 防无限追加:采用
grep -qF(固定字符串精确比对),若密钥已存在直接跳过,绝不重复写盘; - 自适应用户探测:通过
id $U自动判断账号是否存在,单用户机器自动跳过不存在账号; - 权限与属主自愈(StrictModes 容错):目录设为
700、文件设为600,root 写入普通用户目录时自动执行chown -R $U:$U,避免因属主变成 root 导致 SSH 拒绝连接; - 精准删除:采用
sed -i "\|$K|d",按整行内容精准移除,绝不伤及其他已有公钥。
方案 A:常规命令片段(多用户一键并发执行)
创建常规命令片段,点击即可在已连接终端中同时扫描并操作 root 和 ubuntu 两个账号(可按需增减):
# 一键同时向 root 和 ubuntu 追加公钥(常规片段)
K="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5... 你的专属公钥内容"; for U in root ubuntu; do if id "$U" &>/dev/null; then H=$( [ "$U" = root ] && echo /root || echo /home/$U ); mkdir -p "$H/.ssh" && chmod 700 "$H/.ssh"; F="$H/.ssh/authorized_keys"; if grep -qF "$K" "$F" 2>/dev/null; then echo "[$U] 密钥已存在,跳过"; else echo "$K" >> "$F" && chmod 600 "$F"; [ "$U" != root ] && chown -R "$U:$U" "$H/.ssh"; echo "✅ [$U] 密钥已成功追加"; fi; else echo "[$U] 用户不存在,跳过"; fi; done
# 一键同时从 root 和 ubuntu 删除公钥(常规片段)
K="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5... 你的专属公钥内容"; for U in root ubuntu; do if id "$U" &>/dev/null; then H=$( [ "$U" = root ] && echo /root || echo /home/$U ); F="$H/.ssh/authorized_keys"; if grep -qF "$K" "$F" 2>/dev/null; then sed -i "\|$K|d" "$F" && echo "🗑️ [$U] 密钥已删除"; else echo "[$U] 密钥不存在,跳过"; fi; else echo "[$U] 用户不存在,跳过"; fi; done
方案 B:高级自动化脚本(防误触二次确认拦截 · 生产强烈推荐)
Netcatty 片段默认单击即刻运行。针对公钥删除这类高危操作,强烈建议采用自动化脚本 + dialog.confirm() 增加安全防线,避免因手滑误触导致密钥被误删:
// 一键同时向 root 和 ubuntu 追加公钥(自动化脚本)
await nct.screen.waitForPrompt(10000);
const pubKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5... 你的专属公钥内容";
const cmd = `K="${pubKey}"; for U in root ubuntu; do if id "$U" &>/dev/null; then H=$( [ "$U" = root ] && echo /root || echo /home/$U ); mkdir -p "$H/.ssh" && chmod 700 "$H/.ssh"; F="$H/.ssh/authorized_keys"; if grep -qF "$K" "$F" 2>/dev/null; then echo "[$U] 密钥已存在,跳过"; else echo "$K" >> "$F" && chmod 600 "$F"; [ "$U" != root ] && chown -R "$U:$U" "$H/.ssh"; echo "✅ [$U] 密钥已成功追加"; fi; else echo "[$U] 用户不存在,跳过"; fi; done`;
await nct.screen.sendLine(cmd);
nct.log("已提交 root + ubuntu 双用户公钥注入");
// 一键同时从 root 和 ubuntu 删除公钥(自动化脚本 · 带防误触弹窗拦截)
const host = nct.session.name || nct.session.hostname || "当前主机";
// 1. 弹出原生二次确认提示框(彻底杜绝单击误触)
const confirmed = await nct.dialog.confirm(
`⚠️ 危险操作确认\n\n确定要从 [${host}] 的 root 和 ubuntu 用户中删除该 SSH 公钥吗?`
);
if (!confirmed) {
nct.log("用户取消了公钥删除操作");
} else {
// 2. 确认后等待终端提示符
await nct.screen.waitForPrompt(10000);
// 3. 执行双用户批量清理
const pubKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5... 你的专属公钥内容";
const cmd = `K="${pubKey}"; for U in root ubuntu; do if id "$U" &>/dev/null; then H=$( [ "$U" = root ] && echo /root || echo /home/$U ); F="$H/.ssh/authorized_keys"; if grep -qF "$K" "$F" 2>/dev/null; then sed -i "\\|${pubKey}|d" "$F" && echo "🗑️ [$U] 密钥已删除"; else echo "[$U] 密钥不存在,跳过"; fi; else echo "[$U] 用户不存在,跳过"; fi; done`;
await nct.screen.sendLine(cmd);
nct.log("已执行公钥清理");
}
5. 常用一键运维片段库(开箱即用)
(1) 系统资源与网络连接一键体检
echo "=== 系统负载 ===" && uptime && echo "=== 内存占用 ===" && free -h && echo "=== 磁盘空间 ===" && df -hT / && echo "=== 监听端口 ===" && ss -tulpn
(2) 一键开启 Linux BBR 拥塞控制算法
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf && echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf && sysctl -p && sysctl net.ipv4.tcp_congestion_control
(3) Docker 孤儿容器与悬空镜像一键清理
docker container prune -f && docker image prune -f && docker volume prune -f && docker system df
(4) 交互式修改 SSH 端口与防火墙联动
NEW_PORT="{{new_port:2222}}" && sed -i "s/^#\?Port [0-9]\+/Port $NEW_PORT/" /etc/ssh/sshd_config && (command -v ufw >/dev/null && ufw allow $NEW_PORT/tcp || true) && systemctl restart sshd && echo "SSH 端口已修改为: $NEW_PORT"
(5) 查找占用磁盘空间最大的 TOP 10 文件
du -ahx "{{scan_dir:/var}}" 2>/dev/null | sort -rh | head -n 10
(6) Cloudflare DDNS 动态解析一键守护(固定 Token + 动态输入)
bash <(curl -Lso- https://r2.onepve.com/tools/one/cf-ddns-timer.sh) "{{cf_token:你的Cloudflare_API_Token}}" "{{domain}}"
五、端到端加密云同步(E2EE)配置 SOP
Netcatty 采用 Serverless 无服务依赖 架构。所有主机配置在离开设备前,均在本地通过 PBKDF2-HMAC-SHA256(600,000 次迭代)派生密钥,并经 AES-256-GCM 认证加密生成 netcatty-vault.json 密文 Payload,云端仅存放密文。
┌────────────────┐ ┌────────────────┐
│ Netcatty 电脑端 │ │ Netcatty 手机端 │
└───────┬────────┘ └────────┬───────┘
│ AES-256-GCM 本地加密密文 Payload │
├──────────────────────┬────────────────┤
▼
┌───────────────────────────────────────┐
│ 自建对象存储 / WebDAV / GitHub Gist │
│ • Cloudflare R2 / MinIO / AWS S3 │
│ • 坚果云 / Alist / 群晖 NAS (WebDAV) │
└───────────────────────────────────────┘
1. Cloudflare R2 / S3 接入步骤
- 创建 R2 存储桶:在 Cloudflare 控制台创建名为
netcatty-sync的 Bucket,生成 S3 API Token; - 桌面端配置:
- 打开
Settings > Cloud Sync,选择S3 Compatible; - Endpoint:
https://<ACCOUNT_ID>.r2.cloudflarestorage.com - Bucket:
netcatty-sync - Access Key ID / Secret Key:填入对应的 R2 Token 凭据;
- Master Password:设置高强度本地加密主密码;
- 打开
- 移动端接入:在 Netcatty Mobile 中填入相同凭据与主密码,即可瞬间实现双向加密同步。
2. WebDAV(Alist / 坚果云 / 群晖 NAS)接入步骤
- 选择
WebDAV; - Server URL:
https://dav.example.com/dav/netcatty/; - 填入 WebDAV 账号密码与加密主密码即可。
3. Convergent Sync 收敛同步防冲突
内置基于记录级修订版本与删除墓碑(Tombstone)的收敛算法,多设备并发离线修改后联网自动无锁合并,避免数据覆盖与已删主机复活。
六、移动端 Netcatty Mobile 深度实操指南
Netcatty Mobile 采用 Flutter (Dart) 原生重构,为手机触屏量身定制。

1. 触屏辅助按键栏
软键盘上方常驻 ESC、CTRL、ALT、SHIFT、TAB、方向键、Home、End 与一键粘贴条,长按支持按键锁定(如 Ctrl + C),流畅操作 vim、nano 与 htop。
2. 前台服务保活与画中画(PiP)悬浮小窗
- 后台不断连:Android 端持有前台通知服务(Foreground Service)与唤醒锁,切出 App 查阅资料不掉线;
- 画中画小窗:点击画中画按钮将终端缩小为系统悬浮小窗,在进行其他操作的同时实时监控长任务日志。
3. 手机端单双栏 SFTP 与本地存储互传
支持单栏/双栏自适应切换,通过 Android SAF 授权可直接将远程服务器文件与手机本地目录双向流式互传。
4. 进程、Docker 与性能监控大屏
自动识别发行版图标,提供 CPU/内存/磁盘/网络实时卡片,并可直接在 UI 上管理进程(KILL/renice)、Docker 容器/镜像与 systemd 服务的启停。
| 服务器性能监控大屏 | 进程与 Docker 容器管理 |
|---|---|
![]() | ![]() |
| 服务器网格视图 | 树形分组视图 | 列表紧凑视图 |
|---|---|---|
![]() | ![]() | ![]() |
| SSH 密钥与证书管理 | 命令片段与动态变量 | 50+ 套主题切换 |
|---|---|---|
![]() | ![]() | ![]() |
七、Catty AI 运维助手私有化配置
- 进入
Settings > Catty Agent; - Base URL:填写私有反代网关(如
https://ai-proxy.example.com/v1); - API Key:填入访问令牌;
- Model:选择主力大模型;
- 在终端遇到错误时,一键发送给 AI 助手即可获得精准诊断与一键执行命令。
八、信创生态打包与离线化评估
┌──────────────────────────────────────────────────────────┐
│ 信创 Linux 原生打包与离线化方案 │
├────────────────────────────┬─────────────────────────────┤
│ 多架构 Deb 打包 │ 纯离线安全适配 │
│ • Electron-builder 编译 │ • 全量内置 JetBrains 字体 │
│ • 银河麒麟 Kylin arm64 │ • 彻底剥离外部 CDN / 遥测 │
│ • 统信 UOS / x86_64 │ • 100% 物理隔离机房秒开 │
└────────────────────────────┴─────────────────────────────┘
- 信创 Linux 原生打包成本极低:
桌面端通过
electron-builder即可原生编译适用于银河麒麟(Kylin)、统信(UOS)等国产 Linux 发行版的标准arm64与x86_64.deb安装包,命令如下:npm run pack:linux - 字体全量内置与纯离线安全合规: 在打包时将开源 JetBrains Mono / Cascadia Code 字体直接打包进客户端内部,并剥离外部 Google Fonts 在线 CDN 与遥测发包,100% 满足纯物理隔离内网机房的安全合规要求。
- 推荐双轨运维策略:
- 日常主力运维:首选 Netcatty 桌面端 + Netcatty Mobile 移动端,搭配自建 Cloudflare R2 / WebDAV,享受现代高颜值 UI、触屏画中画与开箱即用的自动化代码片段;
- 超轻量/无桌面信创环境:保留原生轻量终端工具作为兜底补充。











