ClipCascade 常用 CLI 命令详解
ClipCascade 三层命令行实操:服务端 systemd/journalctl 运维、curl 三段式 API 调用、Python 端到端收发验证、Linux CLI 客户端启动参数与登录实测,含 Cryptodome 命名空间坑等排障实录。
ClipCascade 常用 CLI 命令详解
ClipCascade 的命令行分三层:服务端生命周期管理(systemd/journalctl)、服务端 API 调用(curl/Python)、Linux 客户端 CLI 程序(
main.py)。本文所有命令与回显均在 Ubuntu 22.04 + ClipCascade v3.3.1 真实服务器实测,账号统一使用管理员admin与普通用户user1(口令均为q1w2e3r4)。部署与选型背景见 《ClipCascade 安装部署指南》 与 《ClipCascade 介绍与选型指南》。
一、命令总览
| 层 | 命令 | 用途 |
|---|---|---|
| 服务端 | systemctl status/start/stop/restart clipcascade | 服务生命周期 |
| 服务端 | journalctl -u clipcascade ... | 运行日志 |
| 服务端 | curl http://127.0.0.1:8080/health、/ping | 免认证探活 |
| 服务端 | curl(cookie + CSRF 三段式) | 登录、管理、改密等 API |
| 服务端 | python3 cc_e2e.py 类脚本 | 端到端收发验证 |
| 客户端 | python3 main.py [--gui] [--xmode] [--polling] | Linux CLI 同步程序 |
二、服务端生命周期命令
systemctl status clipcascade --no-pager -l # 状态与最近日志
systemctl start clipcascade # 启动
systemctl stop clipcascade # 停止
systemctl restart clipcascade # 重启(改配置后必做)
systemctl enable --now clipcascade # 开机自启并立即启动
实测 status 回显(节选):
● clipcascade.service - ClipCascade Clipboard Sync Server
Active: active (running) since Wed 2026-10-28 03:35:28 UTC; 25min ago
Main PID: 4006 (java)
Memory: 398.2M
└─4006 /usr/bin/java -Xms256m -Xmx512m -jar /opt/clipcascade/ClipCascade-Server-JRE_21.jar
重启后确认进程与探活:
systemctl restart clipcascade
sleep 5
systemctl is-active clipcascade
curl -s http://127.0.0.1:8080/health; echo
实测回显:
active
OK
冷启动约 4 秒,sleep 5 足够探活。
三、日志查看命令
journald 轨(stdout 重定向):
journalctl -u clipcascade -n 5 --no-pager -o cat # 最近 5 行
journalctl -u clipcascade -f # 跟踪滚动
journalctl -u clipcascade --since "10 min ago" # 时间窗检索
实测 -n 5 -o cat 回显(节选):
2026-10-28T04:05:22.313Z INFO 4773 --- [ main] c.a.clipcascade.ClipCascadeApplication : Started ClipCascadeApplication in 3.405 seconds (process running for 3.69)
2026-10-28T04:05:26.656Z INFO 4773 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
文件轨:应用滚动日志在工作目录 logs/ 下(本文为 /var/lib/clipcascade/logs/),保留天数与总容量由 CC_SERVER_LOG_HISTORY_MAX_DAYS(默认 30)与 CC_SERVER_LOG_MAX_CAPACITY(默认 1GB)控制,参数详解见 《ClipCascade 配置参数详解》。
四、curl 调用 API(登录三段式)
ClipCascade 无 API Key/Token,认证是"表单登录 + 会话 Cookie + CSRF 头"三段式。以下全流程实测。
第一段:取登录页 Cookie 与 CSRF 隐藏域:
JAR=/tmp/cc.cookies; rm -f $JAR
CSRF=$(curl -s -c $JAR http://127.0.0.1:8080/login | grep -oP 'name="_csrf" value="\K[^"]+')
echo "csrf token: ${CSRF:0:20}..."
实测回显:
csrf token: c2Fd1C3vm8KRmjZnlP9o...
第二段:提交登录表单(密码为原始口令的 SHA3-512 小写十六进制摘要——这是官方客户端约定,摘要本身等价于凭据,注意保管):
DIGEST=$(python3 -c "import hashlib;print(hashlib.sha3_512('q1w2e3r4'.encode()).hexdigest())")
curl -s -b $JAR -c $JAR -o /dev/null -w "%{http_code} -> %{redirect_url}\n" -X POST http://127.0.0.1:8080/login \
--data-urlencode "username=admin" --data-urlencode "password=$DIGEST" --data-urlencode "_csrf=$CSRF"
实测回显(302 到 / 即成功;302 到 /login?error 即失败):
302 -> http://127.0.0.1:8080/
第三段:验明身份并取操作用 CSRF 头:
curl -s -b $JAR http://127.0.0.1:8080/whoami; echo
XHR=$(curl -s -b $JAR http://127.0.0.1:8080/csrf-token); echo $XHR
TOK=$(echo $XHR | python3 -c "import sys,json;print(json.load(sys.stdin)['token'])")
实测回显:
{"role":"ADMIN","username":"admin"}
{"token":"Q9wl4ZlUIb-ZY9n2QNCdUh1MIXhjyqHn7RQ1FZc4DBNSV5daIulHh6BsQ4e0BunGef2pYXl7DEFbr5jKj3BRIqUIaHI0ZKRr","parameterName":"_csrf","headerName":"X-CSRF-TOKEN"}
带 CSRF 头的管理调用(列出全部用户;GET 虽不强制 CSRF,带上保持一致):
curl -s -b $JAR -H "X-CSRF-TOKEN: $TOK" http://127.0.0.1:8080/admin/all-users; echo
实测回显:
[{"username":"admin","password":null,"role":"ADMIN","enabled":true},{"username":"user1","password":null,"role":"USER","enabled":true}]
登出并验证会话吊销:
curl -s -b $JAR -o /dev/null -w "%{http_code}\n" -X POST -H "X-CSRF-TOKEN: $TOK" http://127.0.0.1:8080/logout
curl -s -b $JAR -o /dev/null -w "whoami after logout: %{http_code}\n" http://127.0.0.1:8080/whoami
实测回显:
302
whoami after logout: 302
登出后访问受保护端点统一 302 回登录页。
五、Python 客户端脚本(端到端收发验证)
排障"服务端到底能不能同步"时,最直接的办法是用官方 API 文档的最小示例跑一次 P2S 加密收发。脚本要点:登录 → 连 /clipsocket 的 STOMP 1.1 → 订阅 /user/queue/cliptext → 用 PBKDF2 派生密钥 AES-GCM 加密发送 → 收到回显后解密。核心片段(完整脚本见官方 ClipCascade_Server/API.md):
def derive_key(username, original_password, extra_salt="", rounds=664937):
return hashlib.pbkdf2_hmac("sha256", original_password.encode("utf-8"),
(username + original_password + extra_salt).encode("utf-8"),
rounds, dklen=32)
实测运行回显:
login ok: {"role":"USER","username":"user1"}
websocket url: ws://localhost:8080/clipsocket
STOMP CONNECTED: {'version': '1.1', 'heart-beat': '20000,0', 'user-name': 'user1'}
received envelope type: text
decrypted payload: Hello from an alternative client 👋
STOMP CONNECTED 中的 user-name 确认服务端识别了订阅者身份;同一账号的已订阅会话会收到自己发送的加密信封,解密成功即证明派生密钥、加密参数与服务端链路全部正常。注意依赖为 requests、websocket-client、pycryptodome(或 pycryptodomex,见下文排障实录二)。
六、Linux CLI 客户端
6.1 获取与依赖安装
从官方 Releases 下载 ClipCascade_Linux.zip(v3.3.1 实测约 82 KiB)解压:
curl -L -o ClipCascade_Linux.zip \
https://github.com/Sathvik-Rao/ClipCascade/releases/download/v3.3.1/ClipCascade_Linux.zip
unzip ClipCascade_Linux.zip -d FcOHJtWcP0B0ent
cd FcOHJtWcP0B0ent/ClipCascade
目录结构实测(main.py 为入口):
LICENSE cli clipboard core gui help.txt interfaces
main.py p2p packaging pyproject.toml requirements.txt ...
系统依赖(官方 README Step 1/2/4,Debian/Ubuntu 系):
apt update
apt install -y python3 python3-pip python3-gi xclip wl-clipboard dunst
apt install -y python3-gi-cairo gir1.2-gtk-3.0 gir1.2-gdk-3.0
Python 依赖优先走发行版包(externally-managed-environment 报错时的官方替代路径):
apt install -y python3-xxhash python3-pyperclip python3-requests \
python3-websocket python3-pycryptodome python3-tk python3-pystray \
python3-pyfiglet python3-bs4 python3-plyer python3-aiortc
6.2 启动参数(Linux 专属)
| 参数 | 取值 | 作用 |
|---|---|---|
--gui | true/false | 强制托盘 GUI 或终端 CLI,覆盖自动判定 |
--xmode | true/false | true 用 X11 风格(xclip/GTK 剪贴板),false 用 Wayland 风格(wl-clipboard) |
--polling | 正数(秒) | 覆盖剪贴板轮询间隔 |
参数支持 --gui=false 与 --gui false 两种写法(源码 core/constants.py 实测确认)。不带参数时按会话环境自动判定:XDG_SESSION_TYPE/DISPLAY/WAYLAND_DISPLAY 决定 X11/XWayland/Hyprland/原生 Wayland 分类,X11 与未知环境默认 GUI + X11 剪贴板路径,原生 Wayland 与 Hyprland 默认 CLI + wl-clipboard 路径。
官方示例:
python3 main.py --gui true
python3 main.py --gui false --xmode false --polling 3
python3 main.py --polling 1.5
6.3 CLI 模式登录实测
无图形会话的终端服务器上直接跑:
python3 main.py --gui false
实测回显(完整交互表单):
❌ An error occurred during application initialization: [Errno 2] No such file or directory: 'xclip'
____ _ _ ____ _
/ ___| (_)_ __ / ___|__ _ ___ ___ __ _ __| | ___
| | | | |_) | |__| (_| \__ \ (_| | (_| | (_| | (_| |\___\__,_|\___|
|_|
*****************************************************
Real-Time Clipboard Syncing
https://github.com/Sathvik-Rao/ClipCascade
*****************************************************
══════════════
║ LOGIN FORM ║
══════════════
username []:
password:
server url [http://localhost:8080]:
Enable encryption (recommended) [y]:
Show connection status notifications [y]:
Show advanced settings [n]:
登录表单共 6 项:用户名、密码(getpass 静默输入)、服务器地址(默认 http://localhost:8080)、加密开关(默认开)、连接状态通知(默认开)、高级设置(默认关)。输入 user1 / q1w2e3r4 全部回车确认默认值后,登录成功进入主菜单:
╔══════════════════════════════════╗
║ MAIN MENU ║
╠══════════════════════════════════╣
║ 1 . Connected ║
║ 2 . ⛓️💥 Disconnect ║
║ ──────────────────────────────── ║
║ 3 . 🗒️ Open Logs ║
║ 4 . 📂 Program Files ║
║ ──────────────────────────────── ║
║ 5 . 🏠 Homepage ║
║ 6 . ❓ Help ║
║ 7 . 💟 Donate ║
║ 8 . 🌐 GitHub ║
║ ──────────────────────────────── ║
║ 9 . ℹ️ Version v3.3.0 (latest) ║
║ ──────────────────────────────── ║
║ 10. 🔒 Logoff and Quit ║
║ 11. ❌ Quit ║
╚══════════════════════════════════╝
Choice:
菜单第 1 项实时显示连接状态(Connected),第 9 项自报客户端版本。客户端日志落在程序目录 clipcascade_log.log,每次启动重置。无图形会话下剪贴板监控会自动降级,日志实录:
2026-10-28 04:19:40,729 - INFO - Max size: 1048576
2026-10-28 04:19:40,989 - INFO - XMODE: True
2026-10-28 04:19:40,992 - ERROR - Failed to start clipboard monitor: Error Namespace Gtk not available
Starting polling mode for Unknown server as fallback.
2026-10-28 04:19:40,994 - WARNING - x-clip is not owned by the current user. Switching to wl-clipboard.
即:GTK 事件式监控失败 → 回退轮询 → xclip 归属校验失败再切 wl-clipboard。有图形会话的桌面终端不会出现这条链。
6.4 后台运行与开机自启
官方 README 给出的后台与自启方式:
# 前台运行
cd /path/to/clipcascade/src/ && python3 main.py
# 后台运行
cd /path/to/clipcascade/src/ && nohup python3 main.py &> /dev/null &
# 写入桌面自启脚本
cd /path/to/clipcascade/src/ && nohup python3 main.py &> /dev/null &
更规范的做法是编写 systemd user 单元(~/.config/systemd/user/FcOHJtWcP0B0ent.service)后 systemctl --user enable --now FcOHJtWcP0B0ent,崩溃自动拉起,日志进 journalctl --user -u FcOHJtWcP0B0ent。
七、排障实录
实录一:apt 源没有 python3-xxhash
现象:按官方 Step 4.1 列表安装时报错。
E: Package 'python3-xxhash' has no installation candidate
原因:官方 README 的 apt 清单与发行版仓库实况存在出入(Ubuntu 22.04 的 universe 源中无此包名)。
处置:以 pip 补齐缺口包(pip3 install xxhash),其余仍用 apt 包。教训:依赖清单要以 python3 -c "import 模块名" 逐个验证,而不是照抄文档。
实录二:No module named 'Crypto'(Cryptodome 命名空间坑,官方必踩)
现象:客户端/自写脚本里 from Crypto.Cipher import AES 报错:
Traceback (most recent call last):
File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'Crypto'
原因:发行版仓库安装的是 python3-pycryptodomex(Debian/Ubuntu 打包策略),它提供的命名空间是 Cryptodome 而非 Crypto;而 ClipCascade 客户端代码与官方 API 示例均按 pycryptodome 的 Crypto 命名空间编写。实测确认两者同源同版本:
$ ls -la /usr/lib/python3/dist-packages/ | grep -iE "crypto"
lrwxrwxrwx 1 root root 41 Oct 28 03:39 Crypto -> /usr/lib/python3/dist-packages/Cryptodome
drwxr-xr-x 13 root root 4096 Oct 28 03:39 Cryptodome
drwxr-xr-x 2 root root 4096 Oct 28 03:39 pycryptodomex-3.11.0.egg-info
$ python3 -c "from Cryptodome.Cipher import AES; print('Cryptodome AES ok')"
Cryptodome AES ok
处置(官方 README Step 5.1 的软链方案):让 Crypto 成为 Cryptodome 的别名即可,无需重复安装:
ln -s /usr/lib/python3/dist-packages/Cryptodome /usr/lib/python3/dist-packages/Crypto
python3 -c "from Crypto.Cipher import AES; print('Crypto AES ok:', AES)"
实测回显:
Crypto AES ok: <module 'Crypto.Cipher.AES' from '/usr/lib/python3/dist-packages/Crypto/Cipher/AES.py'>
若系统走 pip 而非发行版包,直接 pip3 install pycryptodome 一步到位,无需软链。
实录三:依赖缺失的渐进报错链
CLI 客户端依赖是惰性导入的,缺什么报什么,实测链条:
ModuleNotFoundError: No module named 'bs4' → apt install python3-bs4
ModuleNotFoundError: No module named 'PIL' → apt install python3-pil
[Errno 2] No such file or directory: 'xclip' → apt install xclip
全部补齐后才能走到登录表单(见 6.3)。Pillow 在官方 requirements.txt 中按 Python 版本锁 10.4.0/12.0.0,apt 的 python3-pil 满足导入即可。
实录四:改了配置不生效
环境变量在进程启动时读取。任何 clipcascade.env 修改后必须 systemctl restart clipcascade,再用 curl -s http://127.0.0.1:<端口>/health 验证。实测改 CC_PORT=8081 重启后:ss -ltn 显示监听 *:8081、curl http://127.0.0.1:8080/health 返回 000(连接拒绝),改回 8080 重启恢复 OK。完整过程见配置篇。
实录五:登录一直失败
先分清两类失败:口令错误返回 302 -> /login?error;触发 BFA 锁定后同样表现为失败但带锁定时间。管理员视角核查:
bfa-snapshot: {"user1":{"ipAccessDetails":{"0:0:0:0:0:0:0:1":{"attempts":4,"lockCount":0,"lockTimeout":0}},"uniqueIpSet":["0:0:0:0:0:0:0:1"],"lockTimeout":0},...}
attempts 为该 IP 对该账号的失败累计,lockTimeout 大于 0 表示处于锁定期。等待解锁或重启服务(内存态追踪器随重启清空,缓存开启时除外)。
八、延伸阅读
- 部署全流程(systemd/nginx/改密):《ClipCascade 安装部署指南》
- 服务端 37 个环境变量:《ClipCascade 配置参数详解》
- 同为"服务端 + CLI"形态的同步工具运维对比:《Syncthing 2.1.7 常用 CLI 命令与工具详解》
- P2P 直连网络的打底组网:《Tailscale 常用 CLI 命令与工具详解》