Hyphanet 0.7.5 常用 CLI 命令与工具详解

Hyphanet 0.7.5 常用 CLI 命令与工具详解:run.sh 六个子命令、FProxy 诊断端点、FCP 探针与 freesite 插入、配置备份恢复、日志排查与卸载清理,基于 build01507 实测。

HyphanetHyphanetJavaUbuntu 22.042026/10/26

Hyphanet 0.7.5 常用 CLI 命令与工具详解

目标:读完本文你将掌握 Hyphanet 0.7.5 的全套命令行运维手段:run.sh 六个子命令、curl 访问 FProxy 诊断端点、FCP 协议探针与 freesite 插入、配置备份恢复、日志排查与卸载清理,已在 Ubuntu 22.04(OpenJDK 17)实测通过。

环境信息:本文所有命令与回显均在下列环境实测完成。

项目内容
软件版本Hyphanet 0.7.5 Build #1507(build01507)
操作系统Ubuntu 22.04 LTS(amd64)
Java 环境OpenJDK 17.0.20.1(openjdk-17-jre-headless)
安装路径/opt/hyphanet(普通用户运行)
端口FProxy 8888 / FCP 9481 / Darknet UDP 17420 / Opennet UDP 39121
实测日期2026-10-26

安装与配置见 《Ubuntu 22.04 安装 Hyphanet 0.7.5 指南》 与 《Hyphanet 0.7.5 配置参数详解》。

一、工具概览

Hyphanet 没有独立的"管理 CLI",运维能力由四类工具组合而成:

工具位置用途
run.sh安装目录节点启停/状态/前台运行/线程转储
curl + FProxy 端点系统自带 + 127.0.0.1:8888HTTP 级诊断(版本/统计/连接/安全级别)
FCP 探针(自建脚本)127.0.0.1:9481协议级验证与自动化(插入/下载)
tar / md5sum系统自带配置与密钥备份恢复
logs/ 日志 + grep/zgrep安装目录运行排查
bin/ 附带小工具bin/端口连通性测试等
Uninstaller/安装目录卸载器

二、前置条件

节点已安装并以普通用户运行(实测验证):

cd /opt/hyphanet
./run.sh status
curl -sI http://127.0.0.1:8888/ | head -1
Freenet 0.7 is running (52573).
HTTP/1.1 200 OK

三、run.sh:节点控制脚本

3.1 命令集

run.sh 支持 6 个子命令(实测错误调用时的 usage 回显):

Usage: ./run.sh { console | start | stop | restart | status | dump }
子命令作用实测要点
start后台启动回显 PID;首次启动会注册 cron 自启并自动设定 JVM 内存上限
stop优雅停止通过删除 anchor 文件触发关停
restart重启stop + start
status查看状态Freenet 0.7 is running (52573).
console前台运行日志直出终端,Ctrl+C 退出
dump请求 JVM 线程转储输出到日志,用于卡死排查

日常节奏(实测可用):

./run.sh status
./run.sh restart
./run.sh status

第二次 status 回显:

Freenet 0.7 is running (53120).

脚本内置行为(实测确认):拒绝 root(Do not run this script as root.);自动探测 Java 并回写 wrapper.conf(日志 Your java executable at /bin/java seems suitable);进程以 nice 10 低优先级运行。

3.2 前台运行(console)

./run.sh console

适合首次启动观察引导过程;Ctrl+C 即停止节点。后台常驻请用 start。

3.3 优雅停机机制与僵死处理

stop 的机制是删除 anchor 文件(Freenet.anchor),节点轮询到文件消失后自行退出。实测 bin/wrapper.log 回显:

STATUS | wrapper  | ... | Anchor file deleted. Shutting down.

实测遇到过一次 stop 后脚本挂起不返回,残留进程与 anchor/pid 文件会阻止下次启动,处理:

ps -ef | grep [f]reenet.node.NodeStarter   # 找到 PID
kill -9 <PID>
rm -f /opt/hyphanet/Freenet.anchor /opt/hyphanet/Freenet.pid
./run.sh start

3.4 快速核对 JVM 进程

openjdk-17-jre-headless 不含 jps(实测 jps -v 空输出),验证进程一律用:

ps -ef | grep [f]reenet.node.NodeStarter

实测回显(节选,可直接读出内存与参数):

hyphanet  53120      1  2 10:31 ?  00:00:30 /usr/lib/jvm/java-17-openjdk-amd64/bin/java -Dnetworkaddress.cache.ttl=0 ... -Xss512k -Xms256m -Xmx512m ... freenet.node.NodeStarter freenet.ini

3.5 bin/ 附带小工具

bin/ 下除各架构 wrapper 二进制外,实测还有:

文件用途
bindtest.jar测试 UDP 端口能否绑定/连通(端口排障)
sha1test.jarSHA1 自检
uncompress.jar压缩编解码测试
browse.sh / browser.jar辅助打开 FProxy
remove_cronjob.sh移除开机自启 cron 任务
wrapper.logwrapper 自身日志(2 MB × 3 滚动)

示例(端口排障):

java -jar bin/bindtest.jar 17420

以上小工具为官方随包提供,本文实测确认文件存在;具体用法可用 java -jar <工具> --help 探索。

四、curl:FProxy 诊断端点速查

FProxy 全部端点均可 curl 访问,无需浏览器。实测(curl -s -o /dev/null -w "%{http_code} %{size_download}" http://127.0.0.1:8888<path>):

端点HTTP用途
/200门户首页(freesite 书签、导航)
/?latestStatus200首页最新状态视图
/stats/200节点统计(内存/线程/带宽/连接)
/diagnostic/200纯文本诊断(版本/存储/插件)
/config/node、/config/fproxy200Web 配置页
/plugins/200插件管理
/downloads/、/uploads/200全局队列
/friends/200Darknet 好友
/strangers/200Opennet 陌生节点
/alerts/200状态告警
/connectivity/200连接/NAT 诊断
/seclevels/200安全级别
/opennet/301 → /strangers/旧地址重定向

版本诊断一例(curl -s http://127.0.0.1:8888/diagnostic/ | head -12):

Freenet Version:
Freenet 0.7.5 Build #1507 build01507
Freenet-ext Build #29 rv29
System Information:
Used Java memory: 399 MiB
Allocated Java memory: 512 MiB
Maximum Java memory: 512 MiB
Running threads: 87/1000
Available CPUs: 6
Java Version: 17.0.20.1

带宽与限速复核(/stats/ 页对应字段):

Input Rate:  20.8 KiB/s (of 1.0 MiB/s)
Output Rate: 21.0 KiB/s (of 160 KiB/s)
Payload Output: 71%

五、FCP 协议探针与 freesite 插入

5.1 端口与协议要点

FCP 监听 127.0.0.1:9481(fcp.port)。它是纯文本行协议,不是 HTTP——curl 无法与其对话(实测确认),环境中若无 nc,用 python3 标准库 socket 即可。

关键协议行为(实测踩坑结论):单独发送 ClientHello 不会得到响应(实测超时),必须把 ClientHello 与业务消息在同一条连接上一次性发送。

5.2 NodeHello + NodeData 探针脚本

import socket, time
s = socket.create_connection(("127.0.0.1", 9481), 10)
msg = (b"ClientHello\nName=cli-probe\nExpectedVersion=2.0\nEnd\n"
       b"GetNode\nIdentifier=cli-probe\nGiveOpennetRef=false\nWithPrivate=false\nEnd\n")
s.sendall(msg)
buf = b""
deadline = time.time() + 20
while time.time() < deadline:
    s.settimeout(max(1, deadline - time.time()))
    try:
        c = s.recv(65536)
    except socket.timeout:
        break
    if not c:
        break
    buf += c
    if b"NodeData" in buf and b"Version=" in buf:
        break
print(buf.decode("utf-8", "replace")[:1600])

实测回显(节选):

NodeHello
CompressionCodecs=4 - GZIP(0), BZIP2(1), LZMA(2), LZMA_NEW(3)
Version=Fred,0.7,1.0,1507
Build=1507
ConnectionIdentifier=b0d4364c11d411384a75dccac8740bb3
Testnet=false
FCPVersion=2.0
NodeLanguage=ENGLISH
ExtBuild=29
EndMessage
NodeData
identity=Ld1~6csuvt6pou1-i-8mi5gK6KWds1JRxYpQUDV6Ohg
myName=Freenet node with no name #7361848122103977527
location=0.169...
lastGoodVersion=Fred,0.7,1.0,1475
physical.udp=10.89.58.2:17420
ark.pubURI=SSK@.../ark
EndMessage

这是最可靠的"节点活着且 FCP 可用"探针:Build=1507 确认版本,NodeData 暴露节点引用要点。

5.3 插入 freesite 实测(ClientPutComplexDir)

用 FCP 插入一个双文件测试站点(index.html + style.css),关键消息结构:先 ClientHello,随后 ClientPutComplexDir(DefaultName=index.html、Persistence=forever),每个文件以 Files.N.Name/UploadFrom=direct/Metadata.ContentType/DataLength 描述并跟随二进制数据块。实测结果:

  • 插入成功,返回站点内容寻址密钥(CHK):
CHK@POSwr3DtF3mmq1hQ1dfo5zWRl607i8KSVAQQ5cY29~8,1p9wXobPJ0DtmnqV1e5-NZ5rz1Rcef5gCkvNSL1RUWs,AAMC--8
  • FProxy 访问验证:GET /CHK@POSwr3DtF3mmq1hQ1dfo5zWRl607i8KSVAQQ5cY29~8,1p9wXobPJ0DtmnqV1e5-NZ5rz1Rcef5gCkvNSL1RUWs,AAMC--8/index.html 返回 HTTP 200,233 字节页面原文返回。

单个文件插入(ClientPut)同样成功,返回 CHK@DpGJIpFA1yIFzuvjatGeiauT~HftCILwqHYpNbs7KnU,...。注意实测行为:直接 GET 裸 CHK 会得到 301(Give more path components in URI),需要补路径/类型(如 /CHK@.../index.html)才能取回内容。

Persistence=forever 的插入在节点重启后仍会继续执行(队列落盘),这也是 6.x 节强调备份 master.keys 的原因。

六、配置备份与恢复(实测)

6.1 备份

先停节点(保证文件一致性),打包密钥与配置(实测命令):

cd /opt/hyphanet
./run.sh stop
tar czf /tmp/hyphanet-config-backup-20261026.tar.gz \
  master.keys client.dat.crypt client-throttle.dat node-throttle.dat \
  bookmarks.dat freenet.ini wrapper.conf memory.autolimit \
  Sharesite.db plugin-data plugins
ls -lh /tmp/hyphanet-config-backup-20261026.tar.gz

实测回显:包大小 1.7 MB。清单说明:

文件作用丢失后果
master.keys节点主密钥(身份/加密根)节点身份不可恢复
client.dat.crypt客户端加密数据(下载队列等)持久队列丢失
bookmarks.dat书签需手工重建
freenet.ini / wrapper.conf配置可重调但费时
plugin-data/、Sharesite.db插件数据插件状态丢失

6.2 恢复与校验

解包到全新目录后逐文件 md5 对比(实测命令与结果):

mkdir /tmp/restore-test && tar xzf /tmp/hyphanet-config-backup-20261026.tar.gz -C /tmp/restore-test
md5sum master.keys freenet.ini | awk '{print $1}'
md5sum /tmp/restore-test/master.keys /tmp/restore-test/freenet.ini | awk '{print $1}'

实测两侧一致(节选):

217215b3...(master.keys)
85a135d9...(freenet.ini)

恢复即"把备份文件放回安装目录(保持属主与 600 权限)再启动节点";迁移到新机时同样先装好同版本节点,再覆盖这些文件。

七、日志查看与排查

7.1 日志文件布局(实测)

文件内容滚动策略
logs/freenet-latest.log当前节点日志(WARNING 级起步,实测 41 KB)按小时滚动
logs/freenet-previous.log上一份—
logs/freenet-1507-2026-10-26-*.log.gz历史压缩日志总量上限 10 MB(logger.maxZippedLogsSize=10485760)
bin/wrapper.logwrapper 启停日志2 MB × 3

7.2 常用命令

tail -f logs/freenet-latest.log                # 实时跟踪
grep -i "error" logs/freenet-latest.log        # 错误检索
zgrep -i "disconnect" logs/freenet-*.log.gz    # 压缩日志检索
tail -50 bin/wrapper.log                       # 启停/异常退出排查

临时调高日志级别:fproxy/config 页 logger 分区或停机改 freenet.ini 的 logger.priority(如 MINOR/DEBUG),排障后调回 WARNING。

八、卸载清理命令

完整卸载流程(自启 → 停止 → 官方卸载器 → 数据清理):

cd /opt/hyphanet
bin/remove_cronjob.sh                    # 1. 取消开机自启
./run.sh stop                            # 2. 停止节点
java -jar Uninstaller/uninstaller.jar    # 3. 官方卸载器(交互式)
rm -rf /opt/hyphanet                     # 4. 彻底清理程序与数据(确认退役时)

说明:卸载器文件实测存在(Uninstaller/uninstaller.jar,167,101 字节),但卸载动作本身未实跑;全部数据都在安装目录内,第 4 步 rm -rf 即可清掉 17.4 GiB 主存储。退役前如需保留身份请先按第六节备份。

九、注意事项

  • 编辑配置必须停机:freenet.ini 在节点关闭时被回写,运行中手改会被覆盖(见《Hyphanet 0.7.5 配置参数详解》);
  • FCP 客户端必须先 ClientHello,且与业务消息同连接发送;curl/HTTP 工具对 9481 无效;
  • 裸 CHK 访问返回 301:取回插入内容要带路径成分;
  • master.keys 权限 600,包含节点身份,不要外发;备份介质同样妥善保管;
  • kill -9 属最后手段,正常优先 ./run.sh stop(优雅停机会把内存队列与配置落盘)。

十、常见问题(FAQ)

10.1 FCP 探针一直超时

对照三点:连接的是 9481 而非 8888;ClientHello 与业务消息同连接一次发送(实测分开发送无响应);fcp.allowedHosts 是否包含来源 IP(默认仅回环)。

10.2 curl 访问 9481 挂起无输出

正常:FCP 不是 HTTP,curl 发送的请求无法被识别响应。改用 5.2 节的 socket 探针。

10.3 status 显示 running 但 Web 打不开

先看监听(fproxy.bindTo=127.0.0.1 时只能本机访问,跨机访问需按配置文档放宽 bindTo/allowedHosts);再 curl -sI http://127.0.0.1:8888/ 确认;仍无响应则查 bin/wrapper.log 是否反复重启。

10.4 备份恢复后下载队列/书签没了

检查恢复清单是否包含 client.dat.crypt(持久队列)与 bookmarks.dat;且恢复时节点已停止、文件属主与权限(600)正确。

10.5 dump / console 有什么区别

console 是前台运行整个节点;dump 是对后台运行中的 JVM 请求线程转储(写入日志),用于节点卡死时分析线程栈,不中断服务。

十一、参考链接