- 开发工具
【免费下载链接】ffsend
:mailbox_with_mail: Easily and securely share files from the command line. A fully featured Firefox Send client.
ffsend 是一款功能完备的 Firefox Send 客户端,它让你只需一条命令,就能通过安全、私密、加密的链接分享文件与目录。本指南以仓库 README.md 为主体,结合 src/action/upload.rs、src/action/download.rs 等源码实现,系统讲解其功能特性、上传下载、远程文件管理、多平台安装、源码构建、环境变量配置、脚本化自动化与安全模型,读完即可上手完成安全的命令行文件分享。
提示:项目当前仍处于 beta 阶段,部分期望特性尚未实现(README.md 原文说明)。默认公开 Send 服务由项目作者提供,本应用与 Firefox、Mozilla 无任何关联。
核心特性一览
ffsend 的核心能力(继承自 README.md):
- 功能完备、友好的命令行工具;
- 上传与下载文件、目录,始终在客户端加密;
- 额外的密码保护、密码生成,以及可配置的下载次数限制;
- 文件与目录的归档(打包)与解档(解包);
- 内置分享链接短链服务与二维码生成器;
- 同时支持 Send v3(当前)与 v2 协议;
- 历史记录追踪文件,便于管理;
- 支持使用自建的 Send 服务器;
- 可检查(
exists/info)或删除(delete)已分享文件; - 准确的错误报告;
- 流式加密与上传/下载,内存占用极低;
- 面向脚本自动化设计,可无交互运行。
上述特性在源码中有清晰对应:archive、clipboard、history、qrcode、urlshorten、send2/send3、infer-command等均是可选的编译特性,定义于 Cargo.toml 的[features]段,默认全部启用。
快速上手:上传与下载
基础上传
# 简单上传 $ ffsend upload my-file.txt https://send.vis.ee/#sample-share-url上传成功后输出分享链接,任何人均可通过该链接(用 ffsend 或浏览器)下载文件。
高级上传
# 高级上传 # - 指定下载次数限制为 1 # - 指定上传过期时间为 5 分钟 # - 输入密码加密文件 # - 上传前先归档文件 # - 将分享链接复制到剪贴板 # - 在浏览器中打开分享链接 $ ffsend upload --downloads 1 --expiry-time 5m --password --archive --copy --open my-file.txt Password: ****** https://send.vis.ee/#sample-share-url各参数说明:
--downloads <COUNT>(别名-d、--downloads、--download):下载次数限制。服务端允许的取值是一组离散值(见 src/cmd/arg/download_limit.rs),若指定的值不在允许列表中,程序会提示并询问是否改用最接近的合法值,除非追加--force;--expiry-time <TIME>(别名-e、--expire、--expiry):文件过期时间。支持人类可读的复合时长格式,如5m、23h14m、8w6d,由 src/util.rs 的parse_duration解析(w/d/h/m/s分别代表周/天/小时/分钟/秒);超过服务端上限时会提示并询问是否改用上限值(见 src/cmd/arg/expiry_time.rs);--password:交互式输入密码,对文件加密保护;也可以直接--password "secret"在命令行中指定;--archive(-a):将文件/目录先归档为.tar再上传。上传目录或多个文件时必须归档;--copy(-c):复制分享链接到剪贴板;--copy-cmd(-C)则复制ffsend download <URL>形式的下载命令(见 src/cmd/matcher/upload.rs 的CopyMode);--open(-o):上传完成后用系统默认浏览器打开分享链接。
使用自有 Send 服务器
# 上传到自己的 host $ ffsend u -h https://example.com/ my-file.txt https://example.com/#sample-share-url-h/--host指定上传目标服务器(src/cmd/arg/host.rs),下载时则会根据分享链接自动猜测 host。
下载文件
# 简单下载 $ ffsend download https://send.vis.ee/#sample-share-url下载流程在 src/action/download.rs 中实现,要点包括:
- 尝试跟随分享链接的重定向(
follow_url,用于处理短链,src/util.rs); - 解析远程文件并检查是否仍存在(
ApiExists),若已过期则报错并从历史记录中移除; - 若文件受密码保护,交互式要求输入密码(
ensure_password); - 下载前检查目标磁盘剩余空间(
ensure_enough_space,src/util.rs); - 若下载的是归档文件且编译了
archive特性,会询问是否自动解档(--extract/-e可跳过询问直接解包); - 输出路径可用
--output <PATH>(-o)指定,默认使用当前目录下的原文件名。
此外,上传命令还支持从标准输入读取数据:把文件参数写为-(例如ffsend upload - < data.txt),ffsend 会先写入临时文件再上传,默认命名为stdin.txt(见 src/action/upload.rs)。
远程文件管理
检查文件是否存在
$ ffsend exists https://send.vis.ee/#sample-share-url Exists: yes查看远程文件信息
$ ffsend info https://send.vis.ee/#sample-share-url ID: b087066715 Name: my-file.txt Size: 12 KiB MIME: text/plain Downloads: 0 of 10 Expiry: 18h2m (64928s)info的表格输出由 src/action/info.rs 生成:ID来自分享链接解析,Name/Size/MIME来自文件元数据,Downloads与Expiry则需要在提供 owner token(文件所有者令牌)后由服务端返回(程序会提示是否提供,也可用--owner <TOKEN>指定);过期时间同时给出人类可读形式与剩余秒数。
查看历史记录
$ ffsend history # LINK EXPIRE 1 https://send.vis.ee/#sample-share-url 23h57m 2 https://send.vis.ee/#other-sample-url 17h38m 3 https://example.com/#sample-share-url 37m30s历史记录默认保存在系统缓存目录下的history.toml(由 src/util.rs 的app_history_file_path计算),可用-H/--history <FILE>或环境变量FFSEND_HISTORY覆盖。--incognito(-i)可让本次操作不写入历史。上传、下载、查看信息等操作会自动维护历史(上传后可在 src/action/upload.rs 看到history_tool::add调用)。
修改文件密码
# 上传后修改密码 $ ffsend password https://send.vis.ee/#sample-share-url Password: ******password子命令(别名pass、p)需要 owner token 认证,可交互输入,也可用--password <PASSWORD>直接指定或--generate-passphrase生成随机口令(见 src/action/password.rs 与 src/cmd/arg/gen_passphrase.rs)。
删除文件
$ ffsend delete https://send.vis.ee/#sample-share-urldelete(别名del、rm)同样需要 owner token 认证,成功后会输出File deleted,并同步清理本地历史记录(src/action/delete.rs)。
其他子命令
除上述命令外,ffsend help还会列出:
parameters(别名params):修改已分享文件的参数(下载次数、过期时间等),同样需要 owner token;generate(别名gen):生成 shell 自动补全脚本(实现见 src/action/generate/completions.rs,仓库 contrib/completions 目录内置了 bash、zsh、fish、elvish 与 PowerShell 的补全文件);debug(别名dbg):查看版本、已启用特性、API 版本支持列表等调试信息(可用ffsend debug验证infer-command特性是否启用);version(别名v):探测 Send 服务器的协议版本。
系统要求
- 支持 Linux、macOS、Windows、FreeBSD、Android(其他 BSD 发行版可能可用);
- 需要终端与网络连接;
- Linux:需要 OpenSSL 与 CA 证书(如
apt install openssl ca-certificates);剪贴板支持可选安装xclip或xsel(CentOS/Red Hat/openSUSE/Fedora 用yum install xclip,Arch 用pacman -S xclip); - Windows:若启用
crypto-openssl特性需安装 OpenSSL(v1.1.0j 或以上); - macOS:若启用
crypto-openssl特性需brew install openssl@1.1; - FreeBSD:需要
pkg install openssl、ca_root_nss,剪贴板支持可装xclip xsel-conrad; - Android:通过 Termux 使用(
pkg install ffsend)。
剪贴板依赖在源码中体现为:Linux/BSD 编译clipboard-bin时通过调用系统xclip/xsel二进制写入剪贴板(因为原生剪贴板随进程退出即失效,见 src/util.rs 的ClipboardType::select);其他平台则使用原生剪贴板接口。
安装方式全景
Linux(全发行版)
推荐使用 snap 包,或手动安装预编译二进制。官方仅提供 64 位(x86_64)包,其他架构需从源码编译。
snap 包(注意:snap 隔离环境只能访问主目录下的文件,且默认配置下无法从 SSH 等上下文使用;如需读写 U 盘先执行snap connect ffsend:removable-media):
snap install ffsend ffsend --helpArch AUR:ffsend-bin(预编译,推荐)、ffsend(源码编译)、ffsend-git(master 分支源码编译),例如yay -S ffsend或aurto add ffsend-bin && sudo pacman -S ffsend-bin。
Nix:
nix-channel --update nix-env --install ffsend ffsend --helpFedora:sudo dnf install ffsend(社区维护,可能略旧)。
Alpine(edge/testing 仓库,社区维护):
apk add ffsend --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing预编译二进制:从最新 release 下载ffsend-v*-linux-x64-static,然后:
# 重命名为 ffsend mv ./ffsend-* ./ffsend # 标记为可执行 chmod a+x ./ffsend # 移入 PATH sudo mv ./ffsend /usr/local/bin/ ffsend --helpmacOS
推荐 homebrew:brew install ffsend;也可用 MacPorts(sudo port selfupdate && sudo port install ffsend)或 Nix(nix-env --install ffsend);预编译二进制同样重命名、chmod a+x后移入/usr/local/bin/。
Windows
推荐 scoop:scoop install ffsend(若使用 WSL,建议改用 Linux 预编译二进制)。预编译二进制(ffsend-v*-windows-x64-static)可在当前目录直接运行.\ffsend.exe --help,或移入System32使其全局可调用:
move .\ffsend.exe C:\Windows\System32\ffsend.exeFreeBSD
# 预编译包 pkg install ffsend # 或从 ports 源码编译安装 cd /usr/ports/www/ffsend && make installAndroid(Termux)
pkg install ffsend ffsend helpDocker 镜像
挂载目录到容器的/data后即可正常使用:
# 无参数调用 docker run --rm -it -v $(pwd):/data timvisee/ffsend # 上传文件 docker run --rm -it -v $(pwd):/data timvisee/ffsend upload my-file.txt # 下载 docker run --rm -it -v $(pwd):/data timvisee/ffsend download https://send.vis.ee/#sample-share-url # 更新镜像 docker pull timvisee/ffsendLinux/macOS 可在 shell 配置中定义别名:alias ffsend='docker run --rm -it -v "$(pwd):/data" timvisee/ffsend'。注意容器方式只能访问挂载路径内的文件。
从源码构建
构建前置要求
- Rust
v1.63(MSRV,Cargo.toml 声明)或更高,建议用 rustup 安装; - OpenSSL 或 LibreSSL 的开发库/头文件:Ubuntu/Debian
apt install build-essential cmake pkg-config libssl-dev;CentOS/Red Hat/openSUSEyum install gcc gcc-c++ make cmake openssl-devel;Archpacman -S openssl base-devel;Fedoradnf install gcc gcc-c++ make cmake openssl-devel;FreeBSDpkg install rust gmake pkgconf python36 libxcb xclip ca_root_nss xsel-conrad(推荐直接修改现成的ffsendport)。
编译与安装
# 方式一:直接从 cargo 安装 cargo install ffsend -f ffsend --help # 方式二:克隆仓库后安装 git clone https://gitcode.com/gh_mirrors/ff/ffsend.git cd ffsend cargo install --path . -f ffsend --help # 或直接通过 cargo 运行 cargo run --release -- --help # 方式三:克隆后直接构建二进制(Linux/macOS) git clone https://gitcode.com/gh_mirrors/ff/ffsend.git cd ffsend cargo build --release ./target/release/ffsend --help编译特性(use flags)
| 特性 | 默认启用 | 说明 |
|---|---|---|
send2 | 默认 | 支持 Send v2 服务器 |
send3 | 默认 | 支持 Send v3 服务器 |
crypto-ring | 默认 | 使用 ring 作为加密后端 |
crypto-openssl | 否 | 使用 OpenSSL 作为加密后端 |
clipboard | 默认 | 支持复制链接到剪贴板 |
history | 默认 | 支持历史记录追踪 |
archive | 默认 | 支持上传/下载时归档与解档 |
qrcode | 默认 | 支持为分享链接渲染二维码 |
urlshorten | 默认 | 支持缩短分享链接 |
infer-command | 默认 | 支持根据二进制名推断子命令(如ffput) |
no-color | 否 | 编译时不包含错误与帮助消息的彩色输出 |
默认特性集合在 Cargo.toml 中定义为["archive", "clipboard", "crypto-ring", "history", "infer-command", "qrcode", "send3", "urlshorten"]。构建时用--features指定,用--no-default-features关闭默认项:
# 默认特性 + no-color cargo install --features no-color cargo build --release --features no-color # 仅保留必需特性 cargo install --no-default-features --features send3,crypto-ring # 带 history 与 clipboard cargo install --no-default-features --features send3,crypto-ring,history,clipboardWindows 终端对彩色支持不稳定,建议编译时提供no-color标志。
配置与环境变量
当前版本不提供配置文件(dotfile)支持(README 明确说明将在后续版本加入)。所有配置通过环境变量完成,每个变量都与一个 CLI 参数对应:
带值型变量(对应 CLI 选项):
| 变量 | 对应 CLI 参数 | 说明 |
|---|---|---|
FFSEND_HISTORY | --history <FILE> | 历史文件路径 |
FFSEND_HOST | --host <URL> | 上传服务器地址 |
FFSEND_TIMEOUT | --timeout <SECONDS> | 请求超时(0 禁用) |
FFSEND_TRANSFER_TIMEOUT | --transfer-timeout <SECONDS> | 传输超时(0 禁用) |
FFSEND_EXPIRY_TIME | --expiry-time <SECONDS> | 默认上传过期时间 |
FFSEND_DOWNLOAD_LIMIT | --download-limit <DOWNLOADS> | 默认下载次数限制 |
FFSEND_API | --api <VERSION> | 服务器 API 版本,-表示自动探测 |
FFSEND_BASIC_AUTH | --basic-auth <USER:PASSWORD> | 受保护代理的 HTTP 基础认证凭据(非 FxA) |
其中超时默认值定义于 src/config.rs:普通请求CLIENT_TIMEOUT = 30秒,传输请求CLIENT_TRANSFER_TIMEOUT = 24 * 60 * 60秒(即一天,避免大文件传输被掐断)。--api的默认行为是优先假设 Send v3(若编译了send3,见 src/config.rs)。
开关型变量(仅需存在即生效,变量值被忽略,可为空字符串):
| 变量 | 对应 CLI 参数 | 说明 |
|---|---|---|
FFSEND_FORCE | --force | 强制执行操作 |
FFSEND_NO_INTERACT | --no-interact | 禁止交互提示 |
FFSEND_YES | --yes | 对提示默认回答是 |
FFSEND_INCOGNITO | --incognito | 隐身模式,不写历史 |
FFSEND_OPEN | --open | 上传后打开分享链接 |
FFSEND_ARCHIVE | --archive | 上传前归档文件 |
FFSEND_EXTRACT | --extract | 下载后解档文件 |
FFSEND_COPY | --copy | 复制分享链接到剪贴板 |
FFSEND_COPY_CMD | --copy-cmd | 复制下载命令到剪贴板 |
FFSEND_QUIET | --quiet | 安静模式,日志最小化 |
FFSEND_VERBOSE | --verbose | 详细日志 |
这些开关的判断在源码中统一通过env_var_present完成,例如 src/cmd/matcher/main.rs 中force()为matches.is_present("force") || env_var_present("FFSEND_FORCE")。
编译期变量:
| 变量 | 说明 |
|---|---|
XCLIP_PATH | 使用clipboard-bin时指定固定的xclip二进制路径(Linux/BSD) |
XSEL_PATH | 使用clipboard-bin时指定固定的xsel二进制路径(Linux/BSD) |
子命令独立二进制:ffput、ffget、ffdel
ffsend支持将特定子命令做成独立二进制名,例如只用ffput上传、ffget下载:
ffput my-file.txt ffget https://send.vis.ee/#sample-share-url预定义的名称映射在 src/config.rs 的INFER_COMMANDS中:ffput→upload、ffget→download、ffdel→delete。设置方法有三种:创建符号链接(推荐)、创建硬链接、复制并重命名二进制。Linux/macOS 示例:
ln -s $(which ffsend) ./ffput ln -s $(which ffsend) ./ffget该能力依赖infer-command编译特性(默认启用),实现逻辑见 src/cmd/handler.rs:解析参数前会读取被调用二进制的文件名,若命中INFER_COMMANDS则自动在参数列表头部插入对应子命令。注意:snap 包因格式限制不支持此特性;可通过ffsend debug检查当前安装是否包含该特性。
脚本化与自动化
ffsend 面向自动化脚本做了专门优化,提供一组无交互参数(README.md 原文):
--no-interact(-I):禁止任何用户交互。对于没有默认值的提示,程序会报错退出(除非同时提供--yes或--force)。编写自动化脚本时应当始终携带此参数。例如上传目录时,提供该参数会跳过"是否归档"的询问并直接按默认值归档;--yes(-y):对"是/否"型提示默认回答"是"。例如下载时本地已有同名文件,提供该参数会在"是否覆盖"询问中直接选择覆盖;--force(-f):强制继续执行动作,跳过一切会导致退出的警告。例如上传超大文件时,提供该参数会忽略文件大小警告继续上传;--quiet(-q):安静模式,输出信息最小化。例如上传时只输出最终的分享链接。
这些参数的提示处理逻辑集中在 src/util.rs 的prompt_yes:assume_yes时直接返回 true;no_interact时若有默认值则自动选择默认值、无默认值则报错退出。
自动化的一般规则:始终提供-I;对"无论如何都要完成"的动作,叠加-y与-f;需要传递分享链接时(如上传)提供-q。这些标志同样可通过上文的环境变量自动设置。
完整的 bash 自动化示例(继承自 README.md):
# 出错即停止 set -e # 上传文件 # -I: 无交互 # -y: 默认是 # -q: 安静输出,只返回分享链接 URL=$(ffsend -Iy upload -q my-file.txt) # 查看文件信息 # -I: 无交互 # -f: 强制,直接展示信息 ffsend -If info $URL # 为已上传文件设置密码 ffsend -I password $URL --password="secret" # 之后自动使用以下标志 # -I: 无交互 # -f: 强制 # -y: 是 export FFSEND_NO_INTERACT=1 FFSEND_FORCE=1 FFSEND_YES=1 # 下载文件,用变量覆盖本地同名文件 ffsend download $URL --password="secret"安全模型
简而言之:ffsend 与 Send 服务可以被认为是安全的,可用于分享敏感文件。但请注意,上传后生成的分享链接允许任何人下载该文件,请勿将链接分享给未经授权的人。
客户端加密
ffsend 使用客户端加密:文件在上传到远程服务器之前已在本地加密,第三方即使拿到密文,没有密钥也无法解密。文件及其元数据使用128-bit AES-GCM加密,并使用HMAC SHA-256签名密钥进行请求认证(README.md 原文),与 Send 服务的加密文档一致。上传流程的加密与流式传输由ffsend-api库在底层完成,ffsend 侧通过ProgressBar(src/progress.rs)实现流式进度上报,因此内存占用极低。
分享链接的密钥风险
解密文件所需的加密密钥包含在分享链接#(hash 片段)之后。在浏览器中直接打开分享链接时,这段密钥不会直接发送给远程服务器。但理论上,恶意网页可能在页面加载后通过脚本窃取链接中的密钥。虽然这种场景极不可能发生,仍有几种防范手段:
- 只用 ffsend 本身下载,不要在浏览器中打开分享链接;
- 上传时用
--password增加一道密码保护,或用password子命令事后追加密码; - 自行托管安全的 Send 服务实例。
免责声明:即便加密方法被认为是安全的,ffsend 对任何未经授权而被解密的文件不提供任何形式或形态的担保。
帮助输出速查
ffsend help输出(版本号以仓库 Cargo.toml 中的0.2.77为准,README 示例中的输出可能略旧):
ffsend 0.2.77 Easily and securely share files from the command line. A fully featured Send client. USAGE: ffsend [FLAGS] [OPTIONS] [SUBCOMMAND] FLAGS: -f, --force Force the action, ignore warnings -h, --help Prints help information -i, --incognito Don't update local history for actions -I, --no-interact Not interactive, do not prompt -q, --quiet Produce output suitable for logging and automation -V, --version Prints version information -v, --verbose Enable verbose information and logging -y, --yes Assume yes for prompts OPTIONS: -A, --api <VERSION> Server API version to use, '-' to lookup [env: FFSEND_API] --basic-auth <USER:PASSWORD> Protected proxy HTTP basic authentication credentials (not FxA) [env: FFSEND_BASIC_AUTH] -H, --history <FILE> Use the specified history file [env: FFSEND_HISTORY] -t, --timeout <SECONDS> Request timeout (0 to disable) [env: FFSEND_TIMEOUT] -T, --transfer-timeout <SECONDS> Transfer timeout (0 to disable) [env: FFSEND_TRANSFER_TIMEOUT] SUBCOMMANDS: upload Upload files [aliases: u, up] download Download files [aliases: d, down] debug View debug information [aliases: dbg] delete Delete a shared file [aliases: del, rm] exists Check whether a remote file exists [aliases: e] generate Generate assets [aliases: gen] help Prints this message or the help of the given subcommand(s) history View file history [aliases: h] info Fetch info about a shared file [aliases: i] parameters Change parameters of a shared file [aliases: params] password Change the password of a shared file [aliases: pass, p] version Determine the Send server version [aliases: v] This application is not affiliated with Firefox or Mozilla.这套参数体系在 src/cmd/handler.rs 中通过 clap 构建:全局 flag(force/no-interact/yes/quiet/verbose等)使用.global(true)注册,可放在子命令前后任意位置;timeout、history等选项通过.env(...)与对应环境变量直接绑定。
许可协议
本项目以 GNU GPL-3.0 许可发布,详见 LICENSE 文件。更多仓库细节可继续阅读 CONTRIBUTING.md 与 SECURITY.md,各发行版打包脚本位于 pkg 目录,shell 补全位于 contrib/completions 目录。
- 开发工具
【免费下载链接】ffsend
:mailbox_with_mail: Easily and securely share files from the command line. A fully featured Firefox Send client.
相关推荐
ffsend:命令行下的Firefox Send文件分享利器
ffsend:命令行下的Firefox Send文件分享利器 项目介绍 ffsend 是一款基于 Firefox Send 服务的全功能命令行客户端,旨在让文件
开发工具Firefox Send Android 客户端深度指南:基于 WebView 的加密文件分享壳应用与构建全流程
Firefox Send Android 客户端深度指南:基于 WebView 的加密文件分享壳应用与构建全流程 Firefox Send(本仓库项目名 sen
后端前端Firefox Send 源码指南:端到端加密文件分享服务的架构、配置与部署实战
Firefox Send 源码指南:端到端加密文件分享服务的架构、配置与部署实战 导读 Firefox Send 是 Mozilla 推出的一款"简单、私密的文
后端前端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考