Logo迷失博客
返回文章列表
常用工具阅读时长:25 分钟

Netcatty (Netcatty Mobile)

发布时间:2026年09月02日 10:30最后修改:2026年09月04日 20:38

现代高颜值跨平台 SSH 终端工作台与移动端套件。深度解析常规命令片段与高级自动化脚本两大模式核心区别、全部模板变量详细用法、多端云同步配置、统一身份凭据与协同实战。

项目信息与仓库导航


在日常服务器管理与远程运维中,SSH 客户端是我们每天打开频率最高的生产力工具。传统终端工具往往存在界面老旧、移动端体验割裂、跨设备配置同步复杂等痛点。

近期开源社区推出的 Netcatty 桌面端及其专属原生移动端 Netcatty Mobile,以极具现代感的 Radix UI 原子设计、原生触屏辅助按键、画中画小窗后台保活,以及零服务器维护成本的端到端加密云同步(E2EE),成为跨端 SSH 远程工作台的新标杆。

本文将结合官方中文全景特性与移动端重构成果,系统梳理 Netcatty 桌面与移动端的全套功能、钥匙串模型、动态代码片段、原生免改源码公钥一键注入脚本,以及自建云同步配置 SOP,作为日常运维速查与实战手册。

Netcatty 桌面端工作台概览


一、桌面端旗舰: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.confdocker-compose.yml 极为丝滑。


二、内置 Catty AI 运维助手实战

Netcatty 原生内置了 Catty Agent AI 运维助手,支持自然语言跨主机操作、报错诊断与集群任务编排。

1. 单主机:智能状态诊断与日志排错

当服务异常或命令报错时,直接向 Catty Agent 发问,它会自动执行探测命令、分析输出并给出结构化的诊断结论。

Catty Agent 单主机智能诊断

2. 多主机:跨节点 Docker Swarm 集群编排

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

Catty Agent 跨双机编排集群


三、钥匙串(Keychain)与统一身份凭据模型

Netcatty 采用了清晰解耦的钥匙串架构,将「密钥」与「登录凭据」独立于具体主机,实现一次录入、多处复用。

┌──────────────────────────────────────────────────────────┐
│                    钥匙串 (Keychain)                     │
├────────────────────────────┬─────────────────────────────┤
│   SSHKey 密钥库             │   Identity 身份凭据库       │
│   • 独立私钥 / 公钥 / 证书  │   • 标签 / 用户名 / 认证方式│
│   • Passphrase 本地安全存储 │   • 独立密码 / 关联 KeyId   │
└─────────────┬──────────────┴──────────────┬──────────────┘
              │ 批量绑定关联                │ 批量绑定关联
              ▼                             ▼
┌──────────────────────────────────────────────────────────┐
│                  主机清单 (Hosts Inventory)               │
│                  主机 A / 主机 B / 主机 C...              │
└──────────────────────────────────────────────────────────┘
  1. SSHKey(独立密钥库):独立管理 RSA、ECDSA、Ed25519 等私钥、公钥与证书,安全隔离存放;
  2. 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 确认框、promptselectform 多表单
会话自感知❌ 无法感知当前主机名、用户与网络状态✅ 完全自感知,直接读取 nct.session.* 实时元数据
终端双向控制❌ 单向注入(仅将字符敲入终端)✅ 双向闭环(等待提示符、等特定输出文本、读屏)
剪贴板机制弹窗自动聚焦,按 Ctrl+V 即时核对防误粘沙箱安全隔离,通过弹窗输入框按 Ctrl+V 粘贴
触发方式仅支持手动点击运行支持 手动连接后自动 (onConnect)特定日志触发 (onOutput)

模式选型速查建议:

  1. 优先使用常规命令片段:单行维护命令、环境体检、Docker 镜像清理、或仅需临时输入 1~2 个参数(如端口号、容器名、固定 Token + 动态域名)的常规 Shell 场景;
  2. 优先使用高级自动化脚本:需根据当前主机/用户动态调整逻辑(如自动读取 nct.session.username 区分 root 与普通用户路径)、高危破坏性操作(如删除公钥、停机、清库,必须弹窗二次确认防误触)、需要等待命令跑完再执行下一步、或者连上跳板机后自动导航交互。

2. 常规命令片段:模板变量语法与运行机制

在普通命令片段中,Netcatty 通过 {{...}} 语法提供零门槛参数注入与弹窗交互。

(1) 支持的 2 种变量语法

  1. 必填变量{{变量名}}
    • 示例:{{domain}}{{container_name}}
    • 说明:点击执行时弹出输入框;若内容为空,输入框会标红警告并阻止运行,防止危险参数空传。
  2. 带默认值变量{{变量名:默认值}}
    • 示例:{{user:root}}{{port:2222}}{{scan_dir:/var}}
    • 说明:冒号后为缺省值,弹窗时已自动填好;直接按回车(Enter)即使用默认值,亦可手工改写。

(2) 交互与底层智能特性

  1. 实时命令预览(Preview):在输入框键入内容的同时,下方实时渲染最终拼装出的完整命令,所见即所得;
  2. 本地持久化记忆:每个片段输入过的数值会自动保存在本地 localStorage,下次点击自动预填上次输入,免除重复输入;
  3. 同名变量合并:一行命令多次出现 {{ip}} 时只弹一次输入框,全局自动替换;
  4. 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 与特定发行版初始账号(如 ubuntudebian 等)。以下脚本内嵌 4 重容错与防重复保障

  • 防无限追加:采用 grep -qF(固定字符串精确比对),若密钥已存在直接跳过,绝不重复写盘;
  • 自适应用户探测:通过 id $U 自动判断账号是否存在,单用户机器自动跳过不存在账号;
  • 权限与属主自愈(StrictModes 容错):目录设为 700、文件设为 600,root 写入普通用户目录时自动执行 chown -R $U:$U,避免因属主变成 root 导致 SSH 拒绝连接;
  • 精准删除:采用 sed -i "\|$K|d",按整行内容精准移除,绝不伤及其他已有公钥。

方案 A:常规命令片段(多用户一键并发执行)

创建常规命令片段,点击即可在已连接终端中同时扫描并操作 rootubuntu 两个账号(可按需增减):

# 一键同时向 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 接入步骤

  1. 创建 R2 存储桶:在 Cloudflare 控制台创建名为 netcatty-sync 的 Bucket,生成 S3 API Token;
  2. 桌面端配置
    • 打开 Settings > Cloud Sync,选择 S3 Compatible
    • Endpointhttps://<ACCOUNT_ID>.r2.cloudflarestorage.com
    • Bucketnetcatty-sync
    • Access Key ID / Secret Key:填入对应的 R2 Token 凭据;
    • Master Password:设置高强度本地加密主密码;
  3. 移动端接入:在 Netcatty Mobile 中填入相同凭据与主密码,即可瞬间实现双向加密同步。

2. WebDAV(Alist / 坚果云 / 群晖 NAS)接入步骤

  1. 选择 WebDAV
  2. Server URLhttps://dav.example.com/dav/netcatty/
  3. 填入 WebDAV 账号密码与加密主密码即可。

3. Convergent Sync 收敛同步防冲突

内置基于记录级修订版本与删除墓碑(Tombstone)的收敛算法,多设备并发离线修改后联网自动无锁合并,避免数据覆盖与已删主机复活。


六、移动端 Netcatty Mobile 深度实操指南

Netcatty Mobile 采用 Flutter (Dart) 原生重构,为手机触屏量身定制。

画中画小窗与系统管理

1. 触屏辅助按键栏

软键盘上方常驻 ESCCTRLALTSHIFTTAB方向键HomeEnd 与一键粘贴条,长按支持按键锁定(如 Ctrl + C),流畅操作 vimnanohtop

2. 前台服务保活与画中画(PiP)悬浮小窗

  • 后台不断连:Android 端持有前台通知服务(Foreground Service)与唤醒锁,切出 App 查阅资料不掉线;
  • 画中画小窗:点击画中画按钮将终端缩小为系统悬浮小窗,在进行其他操作的同时实时监控长任务日志。

3. 手机端单双栏 SFTP 与本地存储互传

支持单栏/双栏自适应切换,通过 Android SAF 授权可直接将远程服务器文件与手机本地目录双向流式互传。

4. 进程、Docker 与性能监控大屏

自动识别发行版图标,提供 CPU/内存/磁盘/网络实时卡片,并可直接在 UI 上管理进程(KILL/renice)、Docker 容器/镜像与 systemd 服务的启停。

服务器性能监控大屏进程与 Docker 容器管理
性能监控系统管理
服务器网格视图树形分组视图列表紧凑视图
网格视图树形视图列表视图
SSH 密钥与证书管理命令片段与动态变量50+ 套主题切换
密钥管理命令片段主题选择器

七、Catty AI 运维助手私有化配置

  1. 进入 Settings > Catty Agent
  2. Base URL:填写私有反代网关(如 https://ai-proxy.example.com/v1);
  3. API Key:填入访问令牌;
  4. Model:选择主力大模型;
  5. 在终端遇到错误时,一键发送给 AI 助手即可获得精准诊断与一键执行命令。

八、信创生态打包与离线化评估

┌──────────────────────────────────────────────────────────┐
│             信创 Linux 原生打包与离线化方案               │
├────────────────────────────┬─────────────────────────────┤
│   多架构 Deb 打包          │   纯离线安全适配            │
│   • Electron-builder 编译  │   • 全量内置 JetBrains 字体 │
│   • 银河麒麟 Kylin arm64   │   • 彻底剥离外部 CDN / 遥测 │
│   • 统信 UOS / x86_64      │   • 100% 物理隔离机房秒开   │
└────────────────────────────┴─────────────────────────────┘
  1. 信创 Linux 原生打包成本极低: 桌面端通过 electron-builder 即可原生编译适用于银河麒麟(Kylin)、统信(UOS)等国产 Linux 发行版的标准 arm64x86_64 .deb 安装包,命令如下:
    npm run pack:linux
    
  2. 字体全量内置与纯离线安全合规: 在打包时将开源 JetBrains Mono / Cascadia Code 字体直接打包进客户端内部,并剥离外部 Google Fonts 在线 CDN 与遥测发包,100% 满足纯物理隔离内网机房的安全合规要求。
  3. 推荐双轨运维策略
    • 日常主力运维:首选 Netcatty 桌面端 + Netcatty Mobile 移动端,搭配自建 Cloudflare R2 / WebDAV,享受现代高颜值 UI、触屏画中画与开箱即用的自动化代码片段;
    • 超轻量/无桌面信创环境:保留原生轻量终端工具作为兜底补充。

推荐阅读