Руководство по использованию

Русский

Быстрый старт

# отправить файл: пароль генерируется автоматически, выводится ссылка + пароль
$ ttl send secret.pdf
No password provided. Generate one? [Y/n]:
Generated password: aB3kL9mXq7Rt
·✧★◉ Thank goodness, secret.pdf is in orbit (1.2 MB)
IMPORTANT! Save your password — required to download and decrypt the file.
Password: aB3kL9mXq7Rt
https://ttl.space/aBcDeFgHiJ

# скачать: пароль запрашивается интерактивно
$ ttl get https://ttl.space/aBcDeFgHiJ
Enter password: ********
Password verified
◉★✧· Phew, secret.pdf landed safe and sound (1.2 MB)

CLI выполняет шифрование, загрузку, скачивание и расшифровку. Сервер никогда не видит ваш пароль или открытые данные.

Установка

Homebrew (macOS)

$ brew install tweenietomatoes/ttl/ttl

Scoop (Windows)

$ scoop bucket add ttl https://github.com/tweenietomatoes/scoop-ttl
$ scoop install ttl

Готовый бинарный файл

# скачайте для вашей платформы из раздела релизов
$ curl -Lo ttl.tar.gz \
  https://github.com/tweenietomatoes/ttl/releases/download/v1.6.0/ttl_1.6.0_linux_amd64.tar.gz
$ tar xzf ttl.tar.gz && sudo mv ttl /usr/local/bin/

Go install

$ go install github.com/tweenietomatoes/ttl/cmd/ttl@latest

Из исходного кода

$ git clone https://github.com/tweenietomatoes/ttl
$ cd ttl && go build -o ttl ./cmd/ttl/
$ sudo mv ttl /usr/local/bin/

Проверка

$ ttl version
ttl 1.6.0

Отправка файлов

Базовая отправка

# автогенерация пароля, TTL по умолчанию 7д
$ ttl send report.xlsx

Если пароль не указан в терминале, CLI спрашивает:

No password provided. Generate one? [Y/n]:

Нажмите Enter или введите y для автогенерации.

Свой пароль

$ ttl send -p mySecretPass -t 1h document.pdf

Одноразовое чтение

# расходуется в момент начала первого скачивания; после обрыва продолжить может только это скачивание
$ ttl send -b photo.jpg

Своё время жизни (TTL)

$ ttl send -t 5m temp-credentials.txt   # истекает через 5 минут
$ ttl send -t 30m meeting-link.txt      # истекает через 30 минут
$ ttl send -t 6h backup.tar.gz          # истекает через 6 часов
$ ttl send -t 1d daily-report.pdf       # истекает через 1 день
$ ttl send -t 3d project-archive.zip    # истекает через 3 дня
$ ttl send -t 5d design-assets.zip      # истекает через 5 дней
$ ttl send report.xlsx                  # истекает через 7 дней (по умолчанию)

Скачивание файлов

Интерактивный режим (терминал)

$ ttl get https://ttl.space/aBcDeFgHiJ
Enter password: ********
Password verified
◉★✧· Phew, document.pdf landed safe and sound (4.2 MB)

Пароль не отображается в терминале. Оригинальное имя файла сохраняется; если файл с таким именем уже есть в каталоге вывода, он не перезаписывается, а новый файл сохраняется как name (1).ext.

Только токен

# можно использовать только 10-символьный токен вместо полного URL
$ ttl get aBcDeFgHiJ

Каталог вывода

$ ttl get -o ~/Downloads aBcDeFgHiJ

По умолчанию файлы сохраняются в текущий каталог. Используйте -o / --output для указания другого каталога.

С флагом пароля

$ ttl get -p mySecretPass https://ttl.space/aBcDeFgHiJ

Браузер

Вы также можете скачивать и расшифровывать файлы в браузере, перейдя по ссылке напрямую. Веб-интерфейс использует тот же формат файлов и те же алгоритмы (Argon2id, XChaCha20-Poly1305) и запрашивает пароль. Установка программ не требуется.

Управление паролем

Пароль является основой ключа шифрования. Он никогда не покидает ваше устройство и никогда не отправляется на сервер. Есть шесть способов его указать:

1. Автогенерация (только отправка)

$ ttl send notes.txt
No password provided. Generate one? [Y/n]: y
Generated password: aB3kL9mXq7Rt

Генерирует криптографически случайный 12-символьный пароль из [0-9A-Za-z]. Доступно только при send (интерактивно или автоматически в режиме --json).

2. Интерактивный ввод

$ ttl send notes.txt
No password provided. Generate one? [Y/n]: n
Enter password: ********
Confirm password: ********

$ ttl get https://ttl.space/aBcDeFgHiJ
Enter password: ********

Пароль не отображается. При send сначала предлагается автогенерация. При get пароль запрашивается напрямую.

3. Флаг: -p / --password

$ ttl send -p mySecretPass file.zip
$ ttl get --password mySecretPass https://ttl.space/aBcDeFgHiJ
-p / --password виден в выводе ps aux и может сохраниться в истории оболочки (~/.bash_history). Избегайте использования в общих средах и скриптах. Используйте вместо этого --password-stdin или --password-file.

4. Stdin: --password-stdin

# передача через echo
$ echo "mySecretPass" | ttl send --password-stdin backup.tar.gz

# передача из менеджера паролей
$ pass show ttl/key | ttl send --password-stdin data.zip

# передача из переменной окружения
$ printenv MY_SECRET | ttl get --password-stdin https://ttl.space/aBcDeFgHiJ

# heredoc
$ ttl send --password-stdin report.pdf <<<"mySecretPass"

Читает первую строку из stdin. Полезно в скриптах, CI/CD-конвейерах и автоматизации. Если stdin не является терминалом и источник пароля не указан, CLI завершается с ошибкой (кроме режима --json, который автоматически генерирует пароль).

5. Файл: --password-file

$ ttl send --password-file /run/secrets/key report.xlsx
$ ttl get --password-file ~/.ttl-key https://ttl.space/aBcDeFgHiJ

Читает первую строку файла (завершающий перевод строки отбрасывается). Совместимо с Docker secrets (/run/secrets/), файлами Vault agent и подобными паттернами.

6. Автоматически обнаруженный файл: ttl.password

Если пароль не указан явно, CLI ищет файл ttl.password рядом с программой, затем ~/.ttl/password. Первая строка используется как пароль.

Одновременно можно использовать только один явный источник пароля. -p / --password, --password-stdin и --password-file нельзя комбинировать. Автоматически обнаруженный файл ttl.password проверяется только при отсутствии всех перечисленных. Минимальная длина: 8 символов.

Справочник параметров

Флаги отправки

ФлагОписаниеПо умолчанию
-p, --password PПароль шифрованияинтерактивно
--password-stdinЧтение пароля из stdin
--password-file FЧтение пароля из файла
-t, --ttl DURВремя жизни7d
-b, --burnОдноразовое чтение (однократное скачивание)выкл
-u, --uploader-onlyСкачать может только ваш собственный API-ключ (Orbit; псевдоним --private)выкл
--timeout DURТайм-аут передачинет
--server URLURL сервераhttps://ttl.space
-h3, --http3Попробовать HTTP/3 (QUIC), откат на TCPвыкл
--jsonВывод JSON в stdout (для скриптов и ИИ-агентов)выкл.

Флаги скачивания

ФлагОписаниеПо умолчанию
-p, --password PПароль расшифровкиинтерактивно
--password-stdinЧтение пароля из stdin
--password-file FЧтение пароля из файла
-o, --output DIRКаталог выводатекущий каталог
--timeout DURТайм-аут передачинет
-h3, --http3Попробовать HTTP/3 (QUIC), откат на TCPвыкл
--jsonВывод JSON в stdout (для скриптов и ИИ-агентов)выкл.

Значения TTL

Бесплатно: 5m 10m 15m 30m 1h 2h 3h 6h 12h 24h 1d 2d 3d 4d 5d 6d 7d

Orbit добавляет: 14d 15d 28d 30d permanent

Тайм-аут

По умолчанию: нет. Зависшая передача возобновляется сама и прекращается, если не может продолжиться. Задать ограничение: --timeout 30m или --timeout 2h.

Примеры

Скрипт: резервное копирование и загрузка

#!/bin/bash
tar czf /tmp/backup.tar.gz /data
echo "$BACKUP_KEY" | ttl send --password-stdin -t 6h /tmp/backup.tar.gz
rm /tmp/backup.tar.gz

Копирование ссылки в буфер обмена (macOS)

$ ttl send -p mypass123 file.pdf | pbcopy

Копирование ссылки в буфер обмена (Linux)

$ ttl send -p mypass123 file.pdf | xclip -sel clip

Одноразовый секрет

$ echo "$DB_PASSWORD" | ttl send --password-stdin -b -t 5m credentials.env
# ссылка работает ровно один раз, истекает через 5 минут

Режим JSON (скрипты & ИИ-агенты)

# отправка: пароль генерируется автоматически в режиме JSON
$ ttl --json send report.pdf
{"ok":true,"link":"https://ttl.space/xK9mQ2vLpA","filename":"report.pdf","size":2097152,"ttl":"7d","burn":false,"uploader_only":false,"is_permanent":false,"password":"aB3kL9mXq7Rt"}

# скачивание
$ ttl --json get -p aB3kL9mXq7Rt xK9mQ2vLpA
{"ok":true,"filename":"report.pdf","size":2097152,"saved_to":"/home/user/report.pdf"}

# ошибки возвращают ok:false
{"ok":false,"error":"Link not found"}

В режиме --json весь вывод: структурированный JSON на stdout. Если при отправке пароль не указан, он генерируется автоматически и включается в ответ. Код выхода: 0 при успехе, 1 при ошибке.

План Orbit

Orbit открывает доступ к файлам большего размера (10 ГБ), более длительному хранению (30 дней или постоянно), файлам только для загрузившего (скачать их может только ваш API-ключ) и управлению файлами (список и удаление). Полное сравнение: Features.

API-ключ определяется автоматически: переменная окружения TTL_API_KEY, ttl.key рядом с программой или ~/.ttl/key. Используйте ttl activate для сохранения ключа или запишите его вручную в одно из этих мест.

# активировать ключ: он вводится без отображения, поэтому не попадает в историю оболочки
$ ttl activate
Enter Orbit API key: ********
Orbit plan activated. Key saved to /usr/local/bin/ttl.key
# без интерактивного ввода: ttl activate --key-stdin  |  ttl activate --key-file F

# проверить план и использование
$ ttl plan
Plan: orbit
Max file size: 10.0 GB
Max TTL: 30 days (or permanent)
Uploads per day: 1000000

Usage:
  Uploads today: 3
  Active storage: 1.2 GB / 500.0 GB

# отправить с продлённым TTL
$ ttl send -t 30d large-backup.tar.gz
# постоянный файл (только Orbit): без срока хранения, хранится, пока вы его не удалите или не закончится подписка
$ ttl send -t permanent archive.tar.gz
# отправить приватный файл: скачать его может только ваш API-ключ (только Orbit)
$ ttl send -u payroll.xlsx

# показать последние загрузки
$ ttl list
  xK9mQ2vLpA    4.2 MB  2026-03-16 10:30 → 2026-04-15 10:30  [active]
  https://ttl.space/xK9mQ2vLpA
  rT7bNw3KpF  912.0 KB  2026-03-15 14:20 → 2026-03-17 14:20  [active (burn)]
  https://ttl.space/rT7bNw3KpF

# удалить файл досрочно
$ ttl delete xK9mQ2vLpA
Deleted: xK9mQ2vLpA

# удалить сохранённый ключ
$ ttl deactivate
Key file removed: /usr/local/bin/ttl.key

HTTP API

Загрузка и скачивание требуют шифровального конвейера CLI (Argon2id + XChaCha20-Poly1305 + блочный AEAD). Для скриптов используйте ttl send / ttl get или режим --json. Указанные ниже конечные точки предназначены для управления файлами Orbit.

Список файлов (Orbit)

$ curl https://ttl.space/v1/files -H "X-API-Key: ttl_orbit_..."
{"files":[{"token":"xK9mQ2vLpA","link":"https://ttl.space/xK9mQ2vLpA","size_bytes":1048576,"created_at":1711800600,"expires_at":1714392600,"burn":false,"expired":false,"uploader_only":false,"is_permanent":false,"is_note":false,"perm_grace_until":0}],"has_more":false}

# следующая страница: только если has_more равно true; передайте next_cursor из предыдущего ответа
$ curl "https://ttl.space/v1/files?cursor=1711800600123456" -H "X-API-Key: ttl_orbit_..."

Возвращает файлы, загруженные с этим ключом, начиная с самых новых, по 20 на страницу. Если has_more равно true, ответ также содержит next_cursor; передайте его как ?cursor=, чтобы получить следующую страницу. Требуется план Orbit.

Удалить файл (Orbit)

$ curl -X DELETE https://ttl.space/v1/files/xK9mQ2vLpA -H "X-API-Key: ttl_orbit_..."

Возвращает 204 No Content при успехе. Требуется план Orbit. Файл должен принадлежать этому ключу.

Ответы об ошибках

СтатусЗначение
401Недействительный или просроченный API-ключ
403Функция требует план Orbit
404Файл не найден или не принадлежит этому ключу
429Превышен лимит запросов
500Внутренняя ошибка сервера, повторите попытку позже
502Хранилище временно недоступно, повторите попытку позже

Ограничения

ОграничениеБесплатноOrbit
Макс. размер файла2 ГБ10 ГБ
Макс. TTL7 дней30 дней или постоянно
Загрузок в день10Без ограничений
Объём загрузок в день (на IP)10 ГББез ограничений
Одновременные загрузки1 на IP1 на IP и 1 на API-ключ
Квота хранилища✗500 ГБ
Список файлов✗✓
Досрочное удаление✓✓
Файлы только для загрузившего✗✓
Мин. длина пароля8 символов
Запросов на IP30 за 10 секунд
Соединений на IP10 одновременных

Шифрование

Файлы шифруются на вашем устройстве перед загрузкой. Сервер хранит только зашифрованные данные и не может расшифровать ваши файлы.

КомпонентАлгоритм / Значение
Формирование ключаArgon2id (time=3, memory=64 MiB, parallelism=1)
ШифрXChaCha20-Poly1305 AEAD

Любое изменение шифротекста приводит к ошибке расшифровки. Сервер проверяет, что скачивающий знает правильный пароль, прежде чем отдать шифротекст, используя односторонний токен, полученный из ключа шифрования.