2019-10-30 20:51:18 +00:00
[![Build status on GitLab CI][gitlab-ci-master-badge]][gitlab-ci-link]
2018-05-21 20:56:21 +00:00
[![Newest release on crates.io][crate-version-badge]][crate-link]
[![Project license][crate-license-badge]](LICENSE)
[crate-license-badge]: https://img.shields.io/crates/l/ffsend.svg
2019-03-01 11:28:33 +00:00
[crate-link]: https://crates.io/crates/ffsend
[crate-version-badge]: https://img.shields.io/crates/v/ffsend.svg
[gitlab-ci-link]: https://gitlab.com/timvisee/ffsend/pipelines
[gitlab-ci-master-badge]: https://gitlab.com/timvisee/ffsend/badges/master/pipeline.svg
2018-05-17 22:32:41 +00:00
2020-01-27 13:00:15 +00:00
# ffsend
2018-05-19 17:33:06 +00:00
> Easily and securely share files from the command line.
2018-05-17 22:08:05 +00:00
> A fully featured [Firefox Send][send] client.
2018-05-19 17:33:06 +00:00
Easily and securely share files and directories from the command line through a
2018-05-18 07:55:45 +00:00
safe, private and encrypted link using a single simple command.
2018-05-17 22:32:41 +00:00
Files are shared using the [Send][send] service and may be up
2019-06-22 20:32:05 +00:00
to 1GB (2.5GB authenticated). Others are able to download these files with this tool, or through
2019-01-03 12:16:24 +00:00
their web browser.
2018-05-17 22:30:26 +00:00
2018-06-04 23:06:12 +00:00
[![ffsend usage demo][usage-demo-svg]][usage-demo-asciinema]
2018-05-22 15:52:15 +00:00
_No demo visible here? View it on [asciinema][usage-demo-asciinema]._
2018-05-17 22:32:41 +00:00
2018-05-17 22:30:26 +00:00
All files are always encrypted on the client, and secrets are never shared with
the remote host. An optional password may be specified, and a default file
lifetime of 1 (up to 20) download or 24 hours is enforced to ensure your stuff
does not remain online forever.
This provides a secure platform to share your files.
Find out more about security [here ](#security ).
2018-05-17 22:08:05 +00:00
- [Features ](#features )
- [Usage ](#usage )
2018-05-17 22:32:41 +00:00
- [Requirements ](#requirements )
2019-12-01 11:16:18 +00:00
- [Install ](#install ) ([Linux](#linux-all-distributions), [macOS ](#macos ), [Windows ](#windows ), [FreeBSD ](#freebsd ), [Android ](#android ), [_Other OS/arch_ ](#other-os-or-architecture ))
2018-05-17 22:08:05 +00:00
- [Build ](#build )
2018-05-18 08:38:33 +00:00
- [Configuration and environment ](#configuration-and-environment )
2018-05-19 17:33:06 +00:00
- [Security ](#security )
2018-05-17 22:08:05 +00:00
- [Help ](#help )
2018-06-01 14:14:42 +00:00
- [Special thanks ](#special-thanks )
2018-05-17 22:08:05 +00:00
- [License ](#license )
2018-05-17 22:30:26 +00:00
The public [Send][send] service that is used as default host is provided by
[Mozilla][mozilla].
2018-05-18 14:51:07 +00:00
This application is not affiliated with [Mozilla][mozilla], [Firefox][firefox]
or [Firefox Send][send] in any way.
2018-05-17 22:30:26 +00:00
2020-01-27 13:00:15 +00:00
_Note: this tool is currently in beta, as some extra desired features are yet to be implemented_
2018-05-17 22:30:26 +00:00
2018-05-17 22:08:05 +00:00
## Features
- Fully featured and friendly command line tool
2020-01-27 13:00:15 +00:00
- Upload and download files and directories securely, always encrypted on the client
2018-08-02 00:57:43 +00:00
- Additional password protection, generation and configurable download limits
2019-03-06 13:17:38 +00:00
- File and directory archiving and extraction
2019-03-15 00:16:41 +00:00
- Built-in share URL shortener and QR code generator
2020-01-27 13:00:15 +00:00
- Supports Firefox Send v3 (current) and v2
2018-05-17 22:08:05 +00:00
- History tracking your files for easy management
2020-01-27 13:00:15 +00:00
- Ability to use your own Send hosts
2018-05-17 22:30:26 +00:00
- Inspect or delete shared files
- Accurate error reporting
2019-03-06 13:17:38 +00:00
- Streaming encryption and uploading/downloading, very low memory footprint
2019-03-19 23:20:06 +00:00
- Intended for use in [scripts ](#scriptability ) without interaction
2018-05-17 22:08:05 +00:00
2018-05-18 12:45:00 +00:00
For a list of upcoming features and ideas, take a look at the
2019-03-12 16:55:30 +00:00
current [open issues ](https://gitlab.com/timvisee/ffsend/issues ) over on GitLab.
2018-05-18 12:45:00 +00:00
2018-05-17 22:08:05 +00:00
## Usage
2018-05-17 22:30:26 +00:00
Easily upload and download:
2018-05-17 22:08:05 +00:00
```bash
# Simple upload
2018-05-17 22:32:41 +00:00
$ ffsend upload my-file.txt
2019-06-02 22:47:36 +00:00
https://send.firefox.com/#sample-share-url
2018-05-17 22:08:05 +00:00
# Advanced upload
2019-10-24 15:29:08 +00:00
# - Specify a download limit of 1
# - Specify upload expiry time of 5 minutes
2018-05-17 22:08:05 +00:00
# - Enter a password to encrypt the file
# - Archive the file before uploading
2018-05-18 14:51:07 +00:00
# - Copy the shareable link to your clipboard
# - Open the shareable link in your browser
2019-12-15 07:55:31 +00:00
$ ffsend upload --downloads 1 --expiry-time 5m --password --archive --copy --open my-file.txt
2018-05-17 22:32:41 +00:00
Password: ** ****
2019-06-02 22:47:36 +00:00
https://send.firefox.com/#sample-share-url
2018-05-17 22:08:05 +00:00
2018-05-17 22:30:26 +00:00
# Upload to your own host
2018-05-17 22:32:41 +00:00
$ ffsend u -h https://example.com/ my-file.txt
2019-06-02 22:47:36 +00:00
https://example.com/#sample-share-url
2018-05-17 22:30:26 +00:00
2018-05-17 22:08:05 +00:00
# Simple download
2018-05-17 22:32:41 +00:00
$ ffsend download https://send.firefox.com/#sample-share-url
2018-05-17 22:30:26 +00:00
```
Inspect remote files:
```bash
# Check if a file exists
2018-05-17 22:32:41 +00:00
$ ffsend exists https://send.firefox.com/#sample-share-url
Exists: yes
# Fetch remote file info
$ ffsend info https://send.firefox.com/#sample-share-url
ID: b087066715
Name: my-file.txt
Size: 12 KiB
MIME: text/plain
Downloads: 0 of 10
Expiry: 18h2m (64928s)
2018-05-17 22:30:26 +00:00
```
Other commands include:
2019-03-25 16:40:53 +00:00
2018-05-17 22:30:26 +00:00
```bash
# View your file history
2018-05-17 22:32:41 +00:00
$ ffsend history
2019-06-29 14:14:12 +00:00
# LINK EXPIRE
1 https://send.firefox.com/#sample-share-url 23h57m
2 https://send.firefox.com/#other-sample-url 17h38m
3 https://example.com/#sample-share-url 37m30s
2018-05-17 22:30:26 +00:00
# Change the password after uploading
2018-05-17 22:32:41 +00:00
$ ffsend password https://send.firefox.com/#sample-share-url
Password: ** ****
2018-05-17 22:30:26 +00:00
# Delete a file
2018-05-17 22:32:41 +00:00
$ ffsend delete https://send.firefox.com/#sample-share-url
2018-05-17 22:08:05 +00:00
```
2018-05-18 12:45:00 +00:00
Use the `--help` flag, `help` subcommand, or see the [help ](#help ) section for
all available subcommands.
2018-05-17 22:08:05 +00:00
2018-05-17 22:32:41 +00:00
## Requirements
2020-01-27 13:00:15 +00:00
- Linux, macOS, Windows, FreeBSD, Android (other BSDs might work)
2018-05-17 22:32:41 +00:00
- A terminal :sunglasses:
2020-01-27 13:00:15 +00:00
- Internet connection
2019-05-04 12:32:59 +00:00
- Linux:
2020-05-17 15:19:02 +00:00
- OpenSSL & CA certificates:
- Ubuntu, Debian and derivatives: `apt install openssl ca-certificates`
2019-05-02 15:27:55 +00:00
- Optional: `xclip` or `xsel` for clipboard support
2019-03-13 12:09:04 +00:00
- Ubuntu, Debian and derivatives: `apt install xclip`
2018-05-18 08:03:19 +00:00
- CentOS/Red Hat/openSUSE/Fedora: `yum install xclip`
- Arch: `pacman -S xclip`
2019-03-06 13:17:38 +00:00
- Windows specific:
2020-05-17 11:15:44 +00:00
- Optional OpenSSL with `crypto-openssl` feature: [» Installer][openssl-windows-installer] (`v1.1.0j` or above)
2019-03-06 21:31:02 +00:00
- macOS specific:
2020-05-17 11:15:44 +00:00
- Optional OpenSSL with `crypto-openssl` feature: `brew install openssl@1.1`
2019-05-02 16:30:44 +00:00
- FreeBSD specific:
2020-05-17 15:19:02 +00:00
- OpenSSL: `pkg install openssl`
2019-05-02 16:30:44 +00:00
- CA certificates: `pkg install ca_root_nss`
- Optional `xclip` & `xsel` for clipboard support: `pkg install xclip xsel-conrad`
2019-12-01 11:16:18 +00:00
- Android specific:
- Termux: [» Termux][termux]
2018-05-17 22:32:41 +00:00
2018-05-17 22:08:05 +00:00
## Install
2020-01-27 13:00:15 +00:00
Because `ffsend` is still in early stages, only limited installation options are
available right now. Feel free to contribute additional packages.
2018-05-31 20:33:09 +00:00
2019-03-12 18:09:20 +00:00
Make sure you meet and install the [requirements ](#requirements ).
2019-03-12 16:55:30 +00:00
See the operating system specific instructions below:
2019-04-04 08:48:48 +00:00
- [Linux ](#linux-all-distributions )
- [macOS ](#macos )
- [Windows ](#windows )
2019-05-04 12:27:22 +00:00
- [FreeBSD ](#freebsd )
2019-12-01 11:16:18 +00:00
- [Android ](#android )
2019-04-04 08:48:48 +00:00
- [_Other OS or architecture_ ](#other-os-or-architecture )
2019-01-16 19:55:36 +00:00
2019-03-13 12:09:04 +00:00
### Linux (all distributions)
2019-03-12 16:55:30 +00:00
Using the [snap ](#linux-snap-package ) package is recommended if supported.
Alternatively you may install it manually using the
[prebuilt binaries ](#linux-prebuilt-binaries ).
2019-03-12 18:09:20 +00:00
Only 64-bit (`x86_64`) packages and binaries are provided.
For other architectures and configurations you may [compile from source ](#build ).
2019-03-12 16:55:30 +00:00
More packages options will be coming soon.
#### Linux: snap package
2019-03-13 11:14:00 +00:00
_Note: The `ffsend` `snap` package is isolated, and can only access files in
2019-03-18 21:42:44 +00:00
your home directory. Choose a different installation option if you don't want
this limitation._
2019-03-13 11:14:00 +00:00
2019-10-16 20:22:37 +00:00
_Note: due to how `snap` is configured by default, you won't be able to use the
package from some contexts such as through SSH without manual modifications. If
you're experiencing problems, please refer to a different installation method
such as the [prebuilt binaries ](#linux-prebuilt-binaries ), or open an issue._
2019-03-06 15:43:21 +00:00
[» `ffsend` ][snapcraft-ffsend]
2019-04-04 08:48:48 +00:00
2019-03-06 15:43:21 +00:00
```bash
snap install ffsend
2019-03-12 16:55:30 +00:00
ffsend --help
2019-03-06 15:43:21 +00:00
```
2019-03-12 16:55:30 +00:00
#### Linux: Arch AUR packages
2019-03-29 17:09:00 +00:00
[» `ffsend-bin` ][aur-ffsend-bin] (precompiled binary, latest release, recommended)
[» `ffsend` ][aur-ffsend] (compiles from source, latest release)
2019-03-27 18:17:13 +00:00
[» `ffsend-git` ][aur-ffsend-git] (compiles from source, latest `master` commit)
2019-01-12 22:19:11 +00:00
```bash
2019-03-27 18:17:13 +00:00
yay -S ffsend
2019-01-12 22:19:11 +00:00
# or
2019-12-03 18:58:16 +00:00
aurto add ffsend-bin
sudo pacman -S ffsend-bin
2019-03-26 12:39:34 +00:00
# or using any other AUR helper
2019-03-12 16:55:30 +00:00
2019-03-23 18:08:07 +00:00
ffsend --help
```
#### Linux: Nix package
2019-05-10 13:51:35 +00:00
_Note: The Nix package is currently not automatically updated, and might be
slightly outdated._
2019-03-23 18:08:07 +00:00
2019-09-24 20:00:44 +00:00
[» ffsend][nix-ffsend]
2019-03-23 18:08:07 +00:00
```bash
nix-channel --update
nix-env --install ffsend
2019-03-12 16:55:30 +00:00
ffsend --help
2019-01-12 22:19:11 +00:00
```
2019-03-25 19:12:35 +00:00
#### Linux: Fedora package
2020-05-17 17:16:15 +00:00
_Note: The Fedora package is maintained by contributors, and might be
slightly outdated._
2019-03-25 19:12:35 +00:00
2019-09-24 20:00:44 +00:00
[» ffsend][fedora-ffsend]
2019-03-25 19:12:35 +00:00
```bash
2020-05-17 17:16:15 +00:00
sudo dnf install ffsend
2019-03-25 19:12:35 +00:00
ffsend --help
```
2019-09-24 20:00:44 +00:00
#### Linux: Alpine package
_Note: The Alpine package is maintained by contributors, it might be outdated.
Choose a different installation method if an important update is missing._
[» ffsend][alpine-ffsend]
```bash
apk add ffsend --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing
ffsend --help
```
2019-03-12 16:55:30 +00:00
#### Linux: Prebuilt binaries
Check out the [latest release][github-latest-release] assets for Linux binaries.
Use the `ffsend-v*-linux-x64-static` binary, to minimize the chance for issues.
2019-03-19 22:30:51 +00:00
If it isn't available yet, you may use an artifact from a
[previous version][github-releases] instead, until it is available.
2019-03-12 16:55:30 +00:00
Make sure you meet and install the [requirements ](#requirements ) before you
continue.
You must make the binary executable, and may want to move it into `/usr/bin` to
make it easily executable:
2019-03-04 19:47:30 +00:00
```bash
2019-03-12 16:55:30 +00:00
# Rename binary to ffsend
mv ./ffsend-* ./ffsend
2019-03-04 19:47:30 +00:00
# Mark binary as executable
chmod a+x ./ffsend
# Move binary into path, to make it easily usable
2019-03-15 19:27:22 +00:00
sudo mv ./ffsend /usr/local/bin/
2019-03-12 16:55:30 +00:00
ffsend --help
```
### macOS
2019-03-23 17:00:29 +00:00
Using the [`homebrew` package ](#macos-homebrew-package ) is recommended.
2019-03-23 16:54:35 +00:00
Alternatively you may install it manually using the
[prebuilt binaries ](#macos-prebuilt-binaries ).
#### macOS: homebrew package
Make sure you've [`homebrew`][homebrew] installed, and run:
2019-03-12 16:55:30 +00:00
2019-03-23 16:54:35 +00:00
```bash
2019-03-23 17:00:29 +00:00
brew install ffsend
2019-03-23 16:54:35 +00:00
ffsend --help
```
2019-03-12 16:55:30 +00:00
2019-03-26 12:05:55 +00:00
#### macOS: Nix package
2019-05-10 13:51:35 +00:00
_Note: The Nix package is currently not automatically updated, and might be
slightly outdated._
2019-03-26 12:05:55 +00:00
```bash
nix-channel --update
nix-env --install ffsend
ffsend --help
```
2019-03-12 16:55:30 +00:00
#### macOS: Prebuilt binaries
Check out the [latest release][github-latest-release] assets for a macOS binary.
2019-03-19 22:30:51 +00:00
If it isn't available yet, you may use an artifact from a
[previous version][github-releases] instead, until it is available.
2019-03-12 16:55:30 +00:00
2019-03-13 13:56:24 +00:00
Then, mark the downloaded binary as an executable.
2019-03-15 19:27:22 +00:00
You then may want to move it into `/usr/local/bin/` to make the `ffsend` command
2019-03-12 16:55:30 +00:00
globally available:
```bash
# Rename file to ffsend
mv ./ffsend-* ./ffsend
# Mark binary as executable
chmod a+x ./ffsend
# Move binary into path, to make it easily usable
2019-03-15 19:27:22 +00:00
sudo mv ./ffsend /usr/local/bin/
2019-03-04 19:47:30 +00:00
ffsend
```
2019-03-12 16:55:30 +00:00
### Windows
2019-03-14 09:11:58 +00:00
Using the [`scoop` package ](#windows-scoop-package ) is recommended.
Alternatively you may install it manually using the
[prebuilt binaries ](#windows-prebuilt-binaries ).
2019-03-12 16:55:30 +00:00
2019-03-13 11:27:12 +00:00
If you're using the [Windows Subsystem for Linux][wsl], it's highly recommended
2019-03-12 16:55:30 +00:00
to install the [prebuilt Linux binary ](#prebuilt-binaries-for-linux ) instead.
2019-03-12 18:09:20 +00:00
Only 64-bit (`x86_64`) binaries are provided.
For other architectures and configurations you may [compile from source ](#build ).
2019-03-12 16:55:30 +00:00
2019-03-14 21:30:02 +00:00
A `chocolatey` package along with an `.msi` installer will be coming soon.
2019-03-14 09:11:58 +00:00
#### Windows: scoop package
2019-03-15 00:16:41 +00:00
Make sure you've [`scoop`][scoop-install] installed, and run:
2019-03-14 09:11:58 +00:00
```bash
scoop install ffsend
ffsend --help
```
2019-03-12 16:55:30 +00:00
#### Windows: Prebuilt binaries
Check out the [latest release][github-latest-release] assets for Windows binaries.
Use the `ffsend-v*-windows-x64-static` binary, to minimize the chance for issues.
2019-03-19 22:30:51 +00:00
If it isn't available yet, you may use an artifact from a
[previous version][github-releases] instead, until it is available.
2019-03-12 16:55:30 +00:00
You can use `ffsend` from the command line in the same directory:
```cmd
.\ffsend.exe --help
```
To make it globally invokable as `ffsend` , you must make the binary available in
your systems `PATH` . The easiest solution is to move it into `System32` :
```cmd
move .\ffsend.exe C:\Windows\System32\ffsend.exe
```
2019-05-04 12:27:22 +00:00
### FreeBSD
[» `ffsend` ][freshports-ffsend]
2019-05-10 13:51:35 +00:00
_Note: The FreeBSD package is currently maintained by FreeBSD contributors,
and might be slightly outdated._
2019-05-04 12:27:22 +00:00
```sh
# Precompiled binary.
pkg install ffsend
# Compiles and installs from source.
cd /usr/ports/www/ffsend & & make install
```
2019-12-01 11:16:18 +00:00
### Android
`ffsend` can be used on Android through Termux, install it first:
[» Termux][termux]
_Note: The Android package is currently maintained by Termux contributors,
and might be slightly outdated._
```sh
# Install package.
pkg install ffsend
ffsend help
```
2019-03-12 16:55:30 +00:00
### Other OS or architecture
2019-03-13 17:56:04 +00:00
If your system runs Docker, you can use the [docker image ](#docker-image ).
2019-03-12 16:55:30 +00:00
There are currently no other binaries or packages available.
You can [build the project from source ](#build ) instead.
2018-05-17 22:08:05 +00:00
2019-03-13 17:56:04 +00:00
#### Docker image
A Docker image is available for using `ffsend` running in a container.
Mount a directory to `/data` , so it's accessible for `ffsend` in the container,
and use the command as you normally would.
[» `timvisee/ffsend` ][docker-hub-ffsend]
```bash
2019-03-18 21:42:44 +00:00
# Invoke without arguments
docker run --rm -it -v $(pwd):/data timvisee/ffsend
# Upload my-file.txt
docker run --rm -it -v $(pwd):/data timvisee/ffsend upload my-file.txt
# Download from specified link
docker run --rm -it -v $(pwd):/data timvisee/ffsend download https://send.firefox.com/#sample-share-url
# Show help
docker run --rm -it -v $(pwd):/data timvisee/ffsend help
2019-03-25 16:40:53 +00:00
# To update the used image
docker pull timvisee/ffsend
2019-03-18 20:29:12 +00:00
```
2019-03-18 16:09:03 +00:00
2019-03-18 20:29:12 +00:00
On Linux or macOS you might define a alias in your shell configuration, to make
it invokable as `ffsend` :
2019-03-25 16:40:53 +00:00
2019-03-18 20:29:12 +00:00
```bash
2019-03-18 16:09:03 +00:00
alias ffsend='docker run --rm -it -v "$(pwd):/data" timvisee/ffsend'
2019-03-13 17:56:04 +00:00
```
2019-03-18 21:42:44 +00:00
_Note: This implementation is limited to accessing the paths you make available
through the specified mount._
2019-03-18 20:29:12 +00:00
2018-05-17 22:08:05 +00:00
## Build
2018-05-17 22:30:26 +00:00
To build and install `ffsend` yourself, you meet the following requirements
before proceeding:
2018-05-17 22:08:05 +00:00
### Build requirements
2020-01-27 13:00:15 +00:00
- Runtime [requirements ](#requirements )
2018-05-17 22:30:26 +00:00
- [`git`][git]
2020-05-30 14:19:12 +00:00
- [`rust`][rust] `v1.40` or higher (install using [`rustup`][rustup])
2020-05-17 15:19:02 +00:00
- [OpenSSL][openssl] or [LibreSSL][libressl] libraries/headers:
2019-05-04 12:29:36 +00:00
- Linux:
- Ubuntu, Debian and derivatives: `apt install build-essential cmake pkg-config libssl-dev`
- CentOS/Red Hat/openSUSE: `yum install gcc gcc-c++ make cmake openssl-devel`
- Arch: `pacman -S openssl base-devel`
2019-01-16 19:55:36 +00:00
- Gentoo: `emerge -a dev-util/pkgconfig dev-util/cmake dev-libs/openssl`
2019-05-04 12:29:36 +00:00
- Fedora: `dnf install gcc gcc-c++ make cmake openssl-devel`
- Or see instructions [here ](https://github.com/sfackler/rust-openssl#linux )
- Windows:
2020-05-17 15:19:02 +00:00
- Optional with `crypto-openssl` feature: See instructions here [here ](https://github.com/sfackler/rust-openssl#windows-msvc )
2019-05-04 12:29:36 +00:00
- macOS:
2020-05-17 15:19:02 +00:00
- Optional with `crypto-openssl` feature: `brew install cmake pkg-config openssl` or see instructions [here ](https://github.com/sfackler/rust-openssl#osx )
2019-05-04 12:29:36 +00:00
- FreeBSD:
- `pkg install rust gmake pkgconf python36 libxcb xclip ca_root_nss xsel-conrad`
- It is a better idea to use & modify the existing `ffsend` port, which manages dependencies for you.
2018-05-17 22:08:05 +00:00
### Compile and install
2018-05-17 22:30:26 +00:00
Then, walk through one of the following steps to compile and install `ffsend` :
2018-05-17 22:08:05 +00:00
2018-05-21 20:32:12 +00:00
- Compile and install it directly from cargo:
2019-05-04 12:29:36 +00:00
```bash
# Compile and install from cargo
cargo install ffsend -f
2018-05-21 20:32:12 +00:00
2019-05-04 12:29:36 +00:00
# Start using ffsend
ffsend --help
```
2018-05-21 20:32:12 +00:00
- Or clone the repository and install it with `cargo` :
2018-05-17 22:08:05 +00:00
2019-05-04 12:29:36 +00:00
```bash
# Clone the project
git clone https://github.com/timvisee/ffsend.git
cd ffsend
2018-05-17 22:08:05 +00:00
2019-05-04 12:29:36 +00:00
# Compile and install
cargo install --path . -f
2018-05-17 22:08:05 +00:00
2019-05-04 12:29:36 +00:00
# Start using ffsend
ffsend --help
2018-05-17 22:08:05 +00:00
2019-05-04 12:29:36 +00:00
# or run it directly from cargo
cargo run --release -- --help
```
2018-05-17 22:08:05 +00:00
- Or clone the repository and invoke the binary directly (Linux/macOS):
2019-05-04 12:29:36 +00:00
```bash
# Clone the project
git clone https://github.com/timvisee/ffsend.git
cd ffsend
2018-05-17 22:08:05 +00:00
2019-05-04 12:29:36 +00:00
# Build the project (release version)
cargo build --release
2018-05-17 22:08:05 +00:00
2019-05-04 12:29:36 +00:00
# Start using ffsend
./target/release/ffsend --help
```
2018-05-17 22:08:05 +00:00
2018-05-18 07:55:45 +00:00
### Compile features / use flags
2018-05-18 08:03:19 +00:00
Different use flags are available for `ffsend` to toggle whether to include
various features.
The following features are available, some of which are enabled by default:
2018-05-18 07:55:45 +00:00
2020-05-17 11:15:44 +00:00
| Feature | Enabled | Description |
| :-------------: | :-----: | :--------------------------------------------------------- |
| `send2` | Default | Support for Firefox Send v2 servers |
| `send3` | Default | Support for Firefox Send v3 servers |
| `crypto-ring` | Default | Use ring as cryptography backend |
| `crypto-openssl` | | Use OpenSSL as cryptography backend |
| `clipboard` | Default | Support for copying links to the clipboard |
| `history` | Default | Support for tracking files in history |
| `archive` | Default | Support for archiving and extracting uploads and downloads |
| `qrcode` | Default | Support for rendering a QR code for a share URL |
| `urlshorten` | Default | Support for shortening share URLs |
| `infer-command` | Default | Support for inferring subcommand based on binary name |
| `no-color` | | Compile without color support in error and help messages |
2018-05-18 07:55:45 +00:00
2018-05-18 08:03:19 +00:00
To enable features during building or installation, specify them with
2019-03-04 19:38:27 +00:00
`--features <features...>` when using `cargo` .
You may want to disable default features first using
2018-05-18 08:03:19 +00:00
`--no-default-features` .
2018-05-18 07:55:45 +00:00
Here are some examples:
```bash
2018-05-18 08:03:19 +00:00
# Defaults set of features with no-color, one of
2018-05-18 07:55:45 +00:00
cargo install --features no-color
cargo build --release --features no-color
2020-05-17 13:21:40 +00:00
# No default features, except required
cargo install --no-default-features --features send3,crypto-ring
2018-05-18 07:55:45 +00:00
2020-05-17 13:21:40 +00:00
# With history and clipboard support
cargo install --no-default--features --features send3,crypto-ring,history,clipboard
2018-05-18 07:55:45 +00:00
```
2019-03-06 13:17:38 +00:00
For Windows systems it is recommended to provide the `no-color` flag, as color
support in Windows terminals is flaky.
2018-05-18 08:38:33 +00:00
## Configuration and environment
The following environment variables may be used to configure the following
2018-05-18 12:45:00 +00:00
defaults. The CLI flag is shown along with it, to better describe the relation
to command line arguments:
2018-05-18 08:38:33 +00:00
2019-03-19 21:09:10 +00:00
| Variable | CLI flag | Description |
| :------------------------ | :----------------------------: | :-------------------------------------------- |
| `FFSEND_HISTORY` | `--history <FILE>` | History file path |
| `FFSEND_HOST` | `--host <URL>` | Upload host |
| `FFSEND_TIMEOUT` | `--timeout <SECONDS>` | Request timeout (0 to disable) |
| `FFSEND_TRANSFER_TIMEOUT` | `--transfer-timeout <SECONDS>` | Transfer timeout (0 to disable) |
| `FFSEND_API` | `--api <VERSION>` | Server API version, `-` to lookup |
| `FFSEND_BASIC_AUTH` | `--basic-auth <USER:PASSWORD>` | Basic HTTP authentication credentials to use. |
2018-05-18 08:38:33 +00:00
These environment variables may be used to toggle a flag, simply by making them
available. The actual value of these variables is ignored, and variables may be
empty.
2019-03-06 14:45:01 +00:00
| Variable | CLI flag | Description |
| :------------------- | :-------------: | :--------------------------------- |
| `FFSEND_FORCE` | `--force` | Force operations |
| `FFSEND_NO_INTERACT` | `--no-interact` | No interaction for prompts |
| `FFSEND_YES` | `--yes` | Assume yes for prompts |
| `FFSEND_INCOGNITO` | `--incognito` | Incognito mode, don't use history |
| `FFSEND_OPEN` | `--open` | Open share link of uploaded file |
| `FFSEND_ARCHIVE` | `--archive` | Archive files uploaded |
| `FFSEND_EXTRACT` | `--extract` | Extract files downloaded |
| `FFSEND_COPY` | `--copy` | Copy share link to clipboard |
| `FFSEND_COPY_CMD` | `--copy-cmd` | Copy download command to clipboard |
| `FFSEND_QUIET` | `--quiet` | Log quiet information |
| `FFSEND_VERBOSE` | `--verbose` | Log verbose information |
2018-05-18 08:38:33 +00:00
2019-03-25 17:55:11 +00:00
Some environment variables may be set at compile time to tweak some defaults.
2019-05-02 15:27:55 +00:00
| Variable | Description |
| :----------- | :------------------------------------------------------------------------- |
2020-02-13 23:24:14 +00:00
| `XCLIP_PATH` | Set fixed `xclip` binary path when using `clipboard-bin` (Linux, * BSD) |
| `XSEL_PATH` | Set fixed `xsel` binary path when using `clipboard-bin` (Linux, * BSD) |
2019-03-25 17:55:11 +00:00
2018-05-18 08:38:33 +00:00
At this time, no configuration or _dotfile_ file support is available.
This will be something added in a later release.
2019-03-17 16:29:44 +00:00
### Binary for each subcommand: `ffput`, `ffget`
2019-03-17 18:45:50 +00:00
`ffsend` supports having a separate binaries for single subcommands, such as
2019-03-17 16:56:18 +00:00
having `ffput` and `ffget` just for to upload and download using `ffsend` .
This allows simple and direct commands like:
2019-03-17 16:29:44 +00:00
```bash
ffput my-file.txt
ffget https://send.firefox.com/#sample-share-url
```
This works for a predefined list of binary names:
2019-04-04 08:48:48 +00:00
- `ffput` → `ffsend upload ...`
- `ffget` → `ffsend download ...`
- `ffdel` → `ffsend delete ...`
- _This list is defined in [`src/config.rs` ](./src/config.rs ) as `INFER_COMMANDS` _
2019-03-17 16:29:44 +00:00
2019-03-17 16:56:18 +00:00
You can use the following methods to set up these single-command binaries:
2019-04-04 08:48:48 +00:00
- Create a properly named symbolic link (recommended)
- Create a properly named hard link
- Clone the `ffsend` binary, and rename it
2019-03-17 16:56:18 +00:00
On Linux and macOS you can use the following command to set up symbolic links in
the current directory:
2019-04-04 08:48:48 +00:00
2019-03-17 16:29:44 +00:00
```bash
ln -s $(which ffsend) ./ffput
ln -s $(which ffsend) ./ffget
```
Support for this feature is only available when `ffsend` is compiled with the
[`infer-command` ](#compile-features--use-flags ) feature flag.
This is usually enabled by default.
To verify support is available with an existing installation, make sure the
feature is listed when invoking `ffsend debug` .
2019-03-17 18:45:50 +00:00
Note that the `snap` package does currently not support this due to how this
package format works.
2019-03-19 23:20:06 +00:00
### Scriptability
`ffsend` is optimized for use in automated scripts. It provides some specialized
arguments to control `ffsend` without user interaction.
- `--no-interact` (`-I`): do not allow user interaction. For prompts not having
a default value, the application will quit with an error, unless `--yes`
or `--force` is provided.
2019-03-19 23:23:15 +00:00
This should **always** be given when using automated scripting.
Example: when uploading a directory, providing this flag will stop the
2019-03-19 23:20:06 +00:00
archive question prompt form popping up, and will archive the directory as
default option.
2019-03-19 23:23:15 +00:00
- `--yes` (`-y`): assume the yes option for yes/no prompt by default.
Example: when downloading a file that already exists, providing this flag
2019-03-19 23:20:06 +00:00
will assume yes when asking to overwrite a file.
- `--force` (`-f`): force to continue with the action, skips any warnings that
2019-03-19 23:23:15 +00:00
would otherwise quit the application.
Example: when uploading a file that is too big, providing this flag will
2019-03-19 23:20:06 +00:00
ignore the file size warning and forcefully continues.
2019-03-19 23:23:15 +00:00
- `--quiet` (`-q`): be quiet, print as little information as possible.
Example: when uploading a file, providing this flag will only output the
2019-03-19 23:20:06 +00:00
final share URL.
2019-03-19 23:23:15 +00:00
Generally speaking, use the following rules when automating:
- Always provide `--no-interact` (`-I`).
- Provide any combination of `--yes` (`-y`) and `--force` (`-f`) for actions you
want to complete no matter what.
- When passing share URLs along, provide the `--quiet` (`-q`) flag, when
uploading for example.
2019-03-19 23:20:06 +00:00
These flags can also automatically be set by defining environment variables as
2019-03-19 23:23:15 +00:00
specified here:
2019-03-19 23:20:06 +00:00
[» Configuration and environment ](#configuration-and-environment )
2019-03-19 23:23:15 +00:00
Here are some examples commands in `bash` :
2019-03-23 16:54:35 +00:00
2019-03-19 23:20:06 +00:00
```bash
# Stop on error
set -e
# Upload a file
# -I: no interaction
# -y: assume yes
# -q: quiet output, just return the share link
URL=$(ffsend -Iy upload -q my-file.txt)
# Render file information
# -I: no interaction
# -f: force, just show the info
ffsend -If info $URL
# Set a password for the uploaded file
ffsend -I password $URL --password="secret"
# Use the following flags automatically from now on
# -I: no interaction
# -f: force
# -y: yes
export FFSEND_NO_INTERACT=1 FFSEND_FORCE=1 FFSEND_YES=1
# Download the uploaded file, overwriting the local variant due to variables
2019-03-19 23:23:15 +00:00
ffsend download $URL --password="secret"
2019-03-19 23:20:06 +00:00
```
2019-03-19 23:23:15 +00:00
For more information on these arguments, invoke `ffsend help` and check out:
2019-03-19 23:20:06 +00:00
[» Configuration and environment ](#configuration-and-environment )
2019-03-19 23:23:15 +00:00
For other questions regarding automation or feature requests, be sure to
2019-03-19 23:20:06 +00:00
[open ](https://github.com/timvisee/ffsend/issues/ ) an issue.
2018-05-19 17:33:06 +00:00
## Security
In short; the `ffsend` tool and the [Send][send] service can be considered
secure, and may be used to share sensitive files. Note though that the
2019-03-26 07:27:50 +00:00
created share link for an upload will allow anyone to download the file.
2018-05-19 17:33:06 +00:00
Make sure you don't share this link with unauthorized people.
For more detailed information on encryption, please read the rest of the
paragraphs in this security section.
_Note: even though the encryption method is considered secure, this `ffsend`
tool does not provide any warranty in any way, shape or form for files that
somehow got decrypted without proper authorization._
#### Client side encryption
`ffsend` uses client side encryption, to ensure your files are securely
encrypted before they are uploaded to the remote host. This makes it impossible
for third parties to decrypt your file without having the secret (encryption
2019-03-13 12:09:04 +00:00
key). The file and its metadata are encrypted using `128-bit AES-GCM` , and a
2018-05-19 17:33:06 +00:00
`HMAC SHA-256` signing key is used for request authentication.
This is consistent with the encryption documentation provided by the
[Send][send] service, `ffsend` is a tool for.
A detailed list on the encryption/decryption steps, and on what encryption is
exactly used can be found [here][send-encryption] in the official service
documentation.
#### Note on share link security
The encryption secret, that is used to decrypt the file when downloading,
is included in the share URL behind the `#` (hash). This secret is never sent
the remote server directly when using the share link in your browser.
It would be possible however for a webpage to load some malicious JavaScript
snippet that eventually steals the secret from the link once the page is loaded.
Although this scenario is extremely unlikely, there are some options to prevent
this from happening:
- Only use this `ffsend` tool, do not use the share link in your browser.
- Add additional protection by specifying a password using `--password` while
uploading, or using the `password` subcommand afterwards.
- Host a secure [Send][send] service instance yourself.
A complete overview on encryption can be found in the official service
documentation [here][send-encryption].
2018-05-17 22:08:05 +00:00
## Help
```
$ ffsend help
2020-05-17 16:14:06 +00:00
ffsend 0.2.64
2019-03-18 15:31:43 +00:00
Tim Visee < 3a4fb3964f @ sinenomine . email >
2018-05-19 17:33:06 +00:00
Easily and securely share files from the command line.
2018-05-17 22:08:05 +00:00
A fully featured Firefox 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
2018-11-29 08:39:34 +00:00
-q, --quiet Produce output suitable for logging and automation
2018-05-17 22:08:05 +00:00
-V, --version Prints version information
-v, --verbose Enable verbose information and logging
-y, --yes Assume yes for prompts
OPTIONS:
2019-03-18 15:31:43 +00:00
-A, --api < VERSION > Server API version to use, '-' to lookup [env: FFSEND_API]
2020-06-21 19:37:46 +00:00
--basic-auth < USER:PASSWORD > Protected proxy HTTP basic authentication credentials (not FxA) [env: FFSEND_BASIC_AUTH]
2018-11-20 12:06:55 +00:00
-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]
2018-05-17 22:08:05 +00:00
SUBCOMMANDS:
upload Upload files [aliases: u, up]
download Download files [aliases: d, down]
debug View debug information [aliases: dbg]
2019-06-29 14:14:12 +00:00
delete Delete a shared file [aliases: del, rm]
2018-05-17 22:08:05 +00:00
exists Check whether a remote file exists [aliases: e]
2019-03-18 15:31:43 +00:00
generate Generate assets [aliases: gen]
2018-05-17 22:08:05 +00:00
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]
2019-02-27 18:42:14 +00:00
version Determine the Send server version [aliases: v]
2018-05-17 22:08:05 +00:00
The public Send service that is used as default host is provided by Mozilla.
This application is not affiliated with Mozilla, Firefox or Firefox Send.
```
2018-06-01 14:14:42 +00:00
## Special thanks
2020-02-11 17:24:54 +00:00
- to all `ffsend` source/package contributors
2018-06-01 14:14:42 +00:00
- to [Mozilla][mozilla] for building and hosting the amazing
[Firefox Send][send] service
- to everyone involved with [asciinema][asciinema] and [svg-term][svg-term] for
providing tools to make great visual demos
- to everyone involved in all crate dependencies used
2018-05-17 22:08:05 +00:00
## License
2018-05-21 20:05:18 +00:00
This project is released under the GNU GPL-3.0 license.
2019-03-26 07:27:50 +00:00
Check out the [LICENSE ](LICENSE ) file for more information.
2018-05-17 22:08:05 +00:00
2018-05-18 14:51:07 +00:00
[usage-demo-asciinema]: https://asciinema.org/a/182225
2018-05-30 18:19:33 +00:00
[usage-demo-svg]: https://cdn.rawgit.com/timvisee/ffsend/6e8ef55b/res/demo.svg
2018-05-17 22:08:05 +00:00
[firefox]: https://firefox.com/
[git]: https://git-scm.com/
2018-05-17 22:30:26 +00:00
[libressl]: https://libressl.org/
2018-08-31 08:48:24 +00:00
[mozilla]: https://mozilla.org/
2018-05-17 22:08:05 +00:00
[openssl]: https://www.openssl.org/
2019-05-02 10:35:27 +00:00
[openssl-windows-installer]: https://u.visee.me/dl/openssl/Win64OpenSSL_Light-1_1_0j.exe
2019-12-01 11:16:18 +00:00
[termux]: https://termux.com/
2018-05-17 22:08:05 +00:00
[rust]: https://rust-lang.org/
[rustup]: https://rustup.rs/
[send]: https://send.firefox.com/
2018-05-19 17:33:06 +00:00
[send-encryption]: https://github.com/mozilla/send/blob/master/docs/encryption.md
2018-06-01 14:14:42 +00:00
[asciinema]: https://asciinema.org/
[svg-term]: https://github.com/marionebl/svg-term-cli
2019-03-19 22:30:51 +00:00
[github-releases]: https://github.com/timvisee/ffsend/releases
2018-05-31 20:33:09 +00:00
[github-latest-release]: https://github.com/timvisee/ffsend/releases/latest
2019-09-24 20:00:44 +00:00
[nix-ffsend]: https://nixos.org/nixos/packages.html?attr=ffsend& channel=nixos-unstable& query=ffsend
2020-05-17 17:16:15 +00:00
[fedora-ffsend]: https://src.fedoraproject.org/rpms/rust-ffsend
2019-03-27 18:17:13 +00:00
[aur-ffsend]: https://aur.archlinux.org/packages/ffsend/
2019-03-26 07:27:50 +00:00
[aur-ffsend-bin]: https://aur.archlinux.org/packages/ffsend-bin/
2019-03-04 15:33:46 +00:00
[aur-ffsend-git]: https://aur.archlinux.org/packages/ffsend-git/
2019-09-24 20:00:44 +00:00
[alpine-ffsend]: https://pkgs.alpinelinux.org/packages?name=ffsend& branch=edge
2019-03-06 15:43:21 +00:00
[snapcraft-ffsend]: https://snapcraft.io/ffsend
2019-03-12 16:55:30 +00:00
[homebrew]: https://brew.sh/
[wsl]: https://docs.microsoft.com/en-us/windows/wsl/install-win10
2019-03-13 17:56:04 +00:00
[docker-hub-ffsend]: https://hub.docker.com/r/timvisee/ffsend
2019-03-15 00:16:41 +00:00
[scoop-install]: https://scoop.sh/#installs-in-seconds
2019-05-02 16:30:44 +00:00
[freshports-ffsend]: https://www.freshports.org/www/ffsend