尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Ente CLI 实战指南:端到端加密云数据的命令行导出与解密

Ente CLI 实战指南:端到端加密云数据的命令行导出与解密 Ente CLI 实战指南端到端加密云数据的命令行导出与解密【免费下载链接】ente End-to-end encrypted cloud for everything.项目地址: https://gitcode.com/GitHub_Trending/en/enteEnte 是一个以端到端加密为核心的开源云平台覆盖照片、认证器Auth等多种数据。Ente CLI是官方提供的命令行工具主要用于将你在 Ente 中的数据照片/视频、认证器条目批量导出到本地并附带一些实用能力例如解密 Ente Auth 的加密导出文件。本文以 cli/README.md 为骨架结合仓库内 cli/main.go、cli/pkg/account.go、cli/pkg/sync.go 等源码系统讲解 Ente CLI 的安装、账户管理、导出、解密与 Docker 部署全流程。读完本文你将掌握如何在一台全新机器上安装并登录 Ente CLI、如何为一个或多个账户配置导出目录并启动同步、如何利用过滤器精确控制导出范围、如何解密 Auth 导出文件以及如何通过配置文件和 Docker 适配自托管环境。一、Ente CLI 是什么从 cli/README.md 的定位描述看Ente CLI 是一个Command Line Utility核心用途是从 Ente 导出数据除此之外它还支持解密 Ente Auth 的导出。仓库中 cli/cmd/root.go 将根命令描述为 CLI tool for exporting your photos from Ente而从实际子命令account、export、auth decrypt、admin、version可以看出它实际上覆盖了照片与认证器两大类数据的管理与导出子命令功能account add / list / update / get-token管理登录账户与导出目录export启动照片/视频数据导出auth decrypt [input] [output]解密 Ente Auth 的加密导出文件admin管理员运维操作需自托管环境version打印当前版本从 cli/main.go 可以看到当前仓库中版本号为v0.3.0var AppVersion v0.3.0运行时可通过ente version输出。CLI 基于 Go 实现命令框架使用 cobra配置读取使用 viper本地状态存储使用 bbolt 数据库。二、安装 Ente CLI2.1 方式一下载预编译二进制推荐README 推荐的方式是从官方 GitHub Releases 下载预编译二进制注意过滤以cli-v0为前缀的 tag 对应的版本例如cli-v0.3.0。下载后得到的是独立、静态链接的二进制无任何外部依赖可直接运行或放入PATH中的任意目录例如/usr/local/bin。2.2 方式二一键构建全部平台二进制仓库提供了 cli/release.sh 脚本可交叉编译出所有目标平台的二进制并输出到bin/目录./release.sh从脚本源码看它通过git describe --tags自动获取最新的cli-*标签并作为版本号VERSION${LATEST_TAG#cli-}随后在CGO_ENABLED0环境下按平台矩阵构建Windows386、amd64产物为.exeLinux386、amd64、arm、arm64macOSdarwinamd64、arm64。构建时使用-ldflags-X main.AppVersion${VERSION} -s -w -trimpath注入版本号并精简二进制最终产物为bin/ente-os-arch或.exe。2.3 方式三从源码构建如果你只想要当前机器平台的单个二进制直接使用 Go 构建go build -o bin/ente main.go这里main.go是 CLI 的入口见 cli/main.go它会完成配置初始化、密钥装载、数据库打开等工作。两种方式产出的都是 standalone、无动态依赖的静态二进制。2.4 方式四Docker 容器如果你倾向容器化运行可以使用仓库根目录下的 cli/docker-compose.yml 与 cli/Dockerfile详见后文「七、使用 Docker 运行」。三、快速上手查看帮助与版本安装完成后先运行帮助命令查看所有可用命令ente --help根命令支持-h/--help与-t/--toggle两个全局 flag后者为 cobra 脚手架自带的占位 flag见 cli/cmd/root.go。查看版本ente version从 cli/main.go 源码可见如果你通过配置文件把 API 端点指向了非官方地址ente version还会额外打印一行Custom endpoint: 你的端点方便确认当前连接的是自托管服务。3.1 首次运行的初始化行为从 cli/main.go 可以了解 CLI 的启动流程version、docs、help三个命令不需要初始化其余命令都会初始化密钥与数据库配置目录优先读取环境变量ENTE_CLI_CONFIG_DIR兼容旧的ENTE_CLI_CONFIG_PATH为空时默认使用~/.ente代码中为homeDir /.ente数据库文件为配置目录下的ente-cli.db是一个 bbolt 数据库cli/pkg/cli.go 中Init()会创建accountsbucket 与临时下载目录CLI 会在系统密钥链keychain/secret service中创建/读取一个DeviceKey32 字节用于在本地加密账户密钥见 cli/pkg/secrets/key_holder.go。这是本地安全的关键磁盘上不落明文密钥。四、账户管理Ente CLI 支持同时配置多个账户例如你自己和家人的账户并为每个账户单独设置导出目录。4.1 添加账户ente account addente account add[!NOTE]ente account add不会创建新账户它只是把已存在的 Ente 账户加入 CLI 的账户列表以便后续导出使用。创建新账户请使用 Ente 的移动端、Web 或桌面应用cli/cmd/account.go 中add的 Long 描述也明确说明了这一点。执行后 CLI 会以交互方式引导你完成登录见 cli/pkg/account.go 的AddAccount流程选择应用类型photos或auth默认photos由 cli/internal/promt.go 的GetAppType交互收集输入导出目录GetExportDir会校验目录存在且可写支持~展开见 cli/internal/promt.go输入邮箱地址登录认证CLI 会根据账户情况自动走以下一种或多种方式见 cli/internal/api/login.go 与 cli/pkg/account.goSRP 密码认证调用/users/srp/attributes、/users/srp/create-session、/users/srp/verify-session完成安全远程口令协议认证邮箱 OTP 验证如果账户未设置密码或启用了邮箱 MFA会通过/users/ott发送一次性验证码再调用/users/verify-email校验TOTP 二次验证若响应标记需要 MFA调用/users/two-factor/verifyPasskey 验证若需要调用/users/two-factor/passkeys/get-token。认证成功后CLI 解密账户的密钥信息MasterKey、SecretKey、Token 等并以DeviceKey 加密后存入 bbolt 数据库见 cli/pkg/account.go 的storeAccount使用model.MakeEncString对密钥做本地加密存储。成功后输出提示Account added successfully run ente export to initiate export of your account data4.2 列出账户ente account listente account listListAccounts见 cli/pkg/account.go会打印已配置的账户数量以及每个账户的 Email、ID、App 类型、ExportDir格式如下Configured accounts: 1 Email: userexample.com ID: 12345 App: photos ExportDir: /home/user/ente-export 4.3 修改导出目录ente account updateente account update --app auth/photos --email emaildomain.com --dir ~/photos参数说明见 cli/cmd/account.go 的 flag 定义Flag说明默认值--app应用类型合法值photos、locker、authphotos--email账户邮箱必填—--dir新的导出目录必填—需要注意update只支持photos、locker、auth三种 app 取值cli/cmd/account.golocker类型的账户可以被配置但当前版本的导出流程会跳过 Locker 数据见 cli/pkg/sync.goLocker export is not supported。UpdateAccount在写入前会调用ValidateDirForWrite校验目标目录存在且可写cli/pkg/account.go。4.4 获取 Tokenente account get-tokenente account get-token --app photos --email emaildomain.com该命令从本地密钥库解密并打印指定账户在指定应用下的访问 Token见 cli/pkg/account.go可用于排查登录问题或集成其他工具。五、导出数据5.1 启动导出ente exportente export执行export后CLI 会遍历所有已配置账户见 cli/pkg/sync.go 的Export流程若没有任何账户提示先使用account add依次处理每个账户日志以[app-email]为前缀例如[photos-userexample.com]跳过未配置导出目录、导出目录校验失败、被--emails过滤器排除的账户Locker 账户直接跳过当前版本不支持 Locker 导出auth类型的账户走 Auth 导出逻辑输出ente_auth.txt见后文 5.4photos类型的账户走完整同步流程拉取远端相册元数据 → 拉取文件元数据 → 创建本地目录 → 下载并解密文件网络错误时自动重试最多重试 20 次每次等待时间按retryCount * 10秒递增cli/pkg/sync.go。5.2 导出过滤器ente export支持以下 flags定义见 cli/cmd/export.go完整帮助见 cli/docs/generated/ente_export.mdFlag说明默认值--albums strings逗号分隔的相册名列表只导出这些相册空全部--emails strings逗号分隔的邮箱列表只导出这些账户的数据空全部账户--exclude-albums strings逗号分隔的相册名列表排除这些相册空--hidden导出隐藏相册传--hiddenfalse排除true--shared导出共享相册传--sharedfalse排除true过滤器逻辑实现在 cli/pkg/model/filter.goSkipAccount仅当--emails非空时生效邮箱匹配不区分大小写并忽略首尾空格SkipAlbum依次判断——相册名是否被排除ExcludeAlbums/Albums、是否共享ExcludeShared、是否隐藏ExcludeHiddenexcludeByName排除列表优先于包含列表且匹配同样忽略大小写与首尾空格。这些边界行为都有对应的单元测试见 cli/pkg/model/filter_test.go例如排除列表优先级高于包含列表包含列表下不在列表中的相册被跳过等用例可作为精确控制导出范围的依据。5.3 同步流程与本地状态photos 账户的同步核心在 cli/pkg/sync.go 的SyncAccount与 cli/pkg/remote_sync.goLoadSecrets用 DeviceKey 解密账户的 Token/MasterKey/SecretKeycli/pkg/secrets/key_holder.gofetchRemoteCollections按增量时间戳拉取远端相册并解密相册密钥自己的相册用 MasterKey 解密共享相册用 PublicKey/SecretKey 做 sealed box 解密见 cli/pkg/secrets/key_holder.gofetchRemoteFiles对每个相册增量拉取文件元数据写入本地 bbolt 缓存createLocalFolderForRemoteAlbums在导出目录创建对应的相册文件夹syncFiles下载文件并本地解密。下载与解密逻辑在 cli/pkg/download.go文件先下载到临时目录默认系统 temp可通过环境变量ENTE_CLI_TMP_PATH覆盖见 cli/pkg/cli.go再使用文件的密钥 nonce 解密为.decrypted文件随后删除密文。Live Photo 的 zip 包还会被解包拆分为 image 与 video 两部分UnpackLivecli/pkg/download.go。同步断点通过每相册的最后同步时间存储于本地数据库因此重复运行ente export只会增量同步新增/变更内容不会重复下载。5.4 Auth 账户的导出auth类型的账户执行的是SyncAuthAccount见 cli/pkg/sync_authenticator.go通过/authenticator/entity/diff增量拉取认证器条目每次 500 条自动翻页见 cli/internal/api/authenticator.go通过/authenticator/key获取认证器主密钥并用账户 MasterKey 解密cli/pkg/secrets/key_holder.go逐条解密条目ChaCha20-Poly1305 Base64见 cli/pkg/mapper/authenticator.go最终把条目明文逐行写入导出目录下的ente_auth.txtcli/pkg/sync_authenticator.go。如果ente_auth.txt已存在CLI 会先将其重命名为带时间戳的备份文件如ente_auth_2026-09-09_04-30-00.txt再写入新文件避免覆盖丢失。六、解密 Ente Auth 的导出文件ente auth decrypt用于解密从 Ente Auth 导出的加密 JSON 文件ente auth decrypt [input] [output] [flags]FlagsFlag说明-p, --password string解密密码不提供则交互式安全输入不回显底层实现在 cli/pkg/authenticator/decrypt.go流程如下解析输入 JSON格式包含version、kdfParamsmemLimit/opsLimit/salt、encryptedData、encryptionNonce字段仅支持version 1的导出格式否则报错unsupported export version未提供-p时通过终端无回显方式收集密码cli/internal/promt.go 的GetSensitiveField使用Argon2idKDF 从密码派生密钥argon2.IDKey(password, salt, opsLimit, memLimit/1024, 1, 32)见 cli/internal/crypto/crypto.gomemLimit必须 ≥ 1024、opsLimit必须 ≥ 1使用派生密钥 nonce 对密文做 ChaCha20-Poly1305 认证解密DecryptChaChaBase64Auth密码错误时会提示 Please check your password and try again成功后明文写入输出文件并打印解密路径。七、使用 Docker 运行7.1 配置与启动仓库提供 cli/docker-compose.yml核心要点如下cli-data卷是必须的需要把宿主机目录挂载到容器内的/cli-data代码中 cli/utils/constants/constants.go 定义了CliDataPath /cli-data/CLI 会把数据库、密钥等状态数据存放到这里可以额外挂载导出目录到/data或其他路径这样在容器内添加账户时把导出目录填/data即可容器内固定执行/bin/sh并开启stdin_open: true与tty: true以便交互式执行 CLI 命令。启动构建detached 模式docker-compose up -d --build[!NOTE] 构建该镜像需要 BuildKit。如果遇到相关报错一个快速的解决办法是在构建命令前加上DOCKER_BUILDKIT1。7.2 进入容器执行命令docker-compose exec ente-cli /bin/sh -c ./ente-cli version docker-compose exec ente-cli /bin/sh -c ./ente-cli account add从 cli/Dockerfile 可以看到镜像采用两阶段构建先用golang镜像在CGO_ENABLED0环境下编译出ente-cli二进制再复制到精简的alpine基础镜像中运行。在容器模式下cli/main.go 会把配置目录强制切换到/cli-data若未挂载卷会直接报错提示Please mount a volume to /cli-data。八、配置文件与自托管端点8.1 配置文件位置CLI 使用 viper 读取 YAML 配置见 cli/main.go 与 cli/config.yaml.example配置文件可以放在以下任一位置$HOME/.ente/config.yaml当前工作目录下的config.yaml$ENTE_CLI_CONFIG_DIR/config.yaml8.2 配置项cli/config.yaml.example 展示了两个配置项endpoint: api: http://localhost:8080 log: http: false # log status code time taken by requests配置项说明默认值endpoint.apiAPI 端点地址https://api.ente.com见 cli/utils/constants/constants.go 的EnteApiUrllog.http是否打印 HTTP 请求状态码与耗时false[!IMPORTANT] 默认端点指向 Ente 官方服务。如果你运行的是自托管 Ente 服务器必须把endpoint.api改为自己的服务地址例如http://localhost:8080CLI 才能连上你的实例。使用自托管端点时ente version会提示Custom endpoint。此外还支持以下环境变量环境变量作用ENTE_CLI_CONFIG_DIR覆盖 CLI 配置/数据目录兼容旧名ENTE_CLI_CONFIG_PATHENTE_CLI_TMP_PATH覆盖下载临时目录九、CLI 文档与命令参考仓库在 cli/docs/generated 目录下存放了所有命令的 Markdown 文档由 cobra 自动生成包括ente.md根命令与子命令总览ente_account.md 及ente_account_add/list/update/get-token系列ente_export.md导出命令完整 flag 参考ente_auth_decrypt.md解密命令参考ente_admin_*系列管理员命令参考。如果修改了命令定义需要重新生成文档可执行见 cli/main.go 与 cli/cmd/root.gogo run main.go docs该命令会把文档重新生成到./docs/generated目录。需要查看某个命令的完整参数时也可以随时使用ente command --help。十、常见使用场景速查场景一导出自己的全部照片/视频ente account add # 按提示选择 photos、输入导出目录与邮箱完成登录 ente export场景二只导出某个相册排除共享相册ente export --albums 2026旅行 --sharedfalse场景三为多个家人账户分别导出到不同目录ente account add ente account update --app photos --email familyexample.com --dir ~/ente/family ente export场景四解密 Auth 导出文件ente auth decrypt ente_auth_export.json ente_auth_export.txt -p 你的密码场景五对接自托管 Ente 服务器在~/.ente/config.yaml中写入endpoint: api: https://photos.your-server.com然后正常ente account add、ente export即可。十一、总结Ente CLI 以数据可随时带走的自主权为设计目标通过 SRP / OTP / TOTP / Passkey 等完整登录流程接入账户将密钥以 DeviceKey 加密后存放在本地 bbolt 数据库中导出时先增量同步元数据再下载解密文件整个过程密钥不出本地因此导出的内容可以直接脱离 Ente 生态独立使用。无论是官方服务用户还是自托管用户掌握account、export、auth decrypt三组命令配合过滤器与 Docker 部署方式就能搭建一套可靠的 Ente 数据备份与迁移流水线。更多命令细节可继续翻阅 cli/docs/generated/ente.md 与 cli/README.md。【免费下载链接】ente End-to-end encrypted cloud for everything.项目地址: https://gitcode.com/GitHub_Trending/en/ente创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表