# 파일 전송 — 비밀번호가 자동 생성되고, 링크와 비밀번호가 출력됩니다 $ ttl send secret.pdf No password provided. Generate one? [Y/n]: Generated password: aB3kL9mX ·✧★◉ Thank goodness, secret.pdf is in orbit (1.2 MB) IMPORTANT! Save your password — required to download and decrypt the file. Password: aB3kL9mX 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가 자동으로 암호화, 업로드, 다운로드 및 복호화를 수행합니다. 서버는 비밀번호나 평문 데이터를 절대 볼 수 없습니다.
$ brew install tweenietomatoes/ttl/ttl
$ scoop bucket add ttl https://github.com/tweenietomatoes/scoop-ttl $ scoop install ttl
# 릴리스에서 해당 플랫폼용 바이너리를 다운로드하세요 $ curl -Lo ttl.tar.gz \ https://github.com/tweenietomatoes/ttl/releases/latest/download/ttl_linux_amd64.tar.gz $ tar xzf ttl.tar.gz && sudo mv ttl /usr/local/bin/
$ 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 v1.3.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 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)
비밀번호는 표시되지 않습니다. 원래 파일 이름이 복원됩니다.
# 전체 URL 대신 10자리 토큰만 사용할 수도 있습니다 $ ttl get aBcDeFgHiJ Enter password: ******** Password verified ◉★✧· Phew, document.pdf landed safe and sound (4.2 MB)
$ ttl get -o ~/Downloads aBcDeFgHiJ
기본적으로 파일은 현재 디렉토리에 저장됩니다. -o / --output을 사용하여 다른 디렉토리를 지정하세요.
$ ttl get -p mySecretPass https://ttl.space/aBcDeFgHiJ
링크를 직접 방문하여 브라우저에서도 파일을 다운로드하고 복호화할 수 있습니다. 웹 인터페이스는 동일한 암호화 라이브러리를 사용하며 비밀번호를 요청합니다. 소프트웨어 설치가 필요 없습니다.
비밀번호는 암호화 키의 시드로 사용됩니다. 비밀번호는 기기를 떠나지 않으며 서버로 전송되지 않습니다. 비밀번호를 지정하는 방법은 다섯 가지가 있습니다:
$ ttl send notes.txt No password provided. Generate one? [Y/n]: y Generated password: aB3kL9mX
[0-9A-Za-z]에서 암호학적으로 안전한 무작위 8자리 비밀번호를 생성합니다. 터미널에서 send 시에만 사용 가능합니다.
$ 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 시에는 바로 입력하라는 메시지가 표시됩니다.
-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을 사용하세요.--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 사용 시 제외 — 이 경우 비밀번호가 자동 생성됩니다).
--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 에이전트 파일 등과 호환됩니다.
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 | 읽은 후 삭제 (일회성 다운로드) | 끔 |
--timeout DUR | 전송 타임아웃 | 자동 |
--server URL | 서버 URL | https://ttl.space |
-h3, --http3 | HTTP/3 (QUIC) 시도, TCP로 폴백 | 끔 |
--json | stdout으로 JSON 출력 (스크립트 및 AI 에이전트용) | 끔 |
| 플래그 | 설명 | 기본값 |
|---|---|---|
-p, --password P | 복호화 비밀번호 | 대화형 |
--password-stdin | stdin에서 비밀번호 읽기 | |
--password-file F | 파일에서 비밀번호 읽기 | |
-o, --output DIR | 출력 디렉토리 | 현재 디렉토리 |
--timeout DUR | 전송 타임아웃 | 자동 |
-h3, --http3 | HTTP/3 (QUIC) 시도, TCP로 폴백 | 끔 |
--json | stdout으로 JSON 출력 (스크립트 및 AI 에이전트용) | 끔 |
무료: 5m 10m 15m 30m 1h 2h 3h 6h 12h 24h 1d 2d 3d 4d 5d 6d 7d
Orbit 추가: 14d 15d 28d 30d
기본값: 자동 — 1 Mbps 기준 파일 크기로 추정하며 2분의 여유를 추가합니다 (최소 5분). --timeout 10m 또는 --timeout 1h로 재정의할 수 있습니다.
#!/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
$ ttl send -p mypass123 file.pdf | pbcopy
$ ttl send -p mypass123 file.pdf | xclip -sel clip
$ echo "$DB_PASSWORD" | ttl send --password-stdin -b -t 5m credentials.env # 링크는 정확히 한 번만 작동하며, 5분 후 만료됩니다
# 전송 — JSON 모드에서 비밀번호가 자동 생성됩니다 $ ttl --json send report.pdf {"ok":true,"link":"https://ttl.space/xK9mQ2vLpA","filename":"report.pdf","size":2097152,"ttl":"7d","burn":false,"password":"aB3kL9mX"} # 다운로드 $ ttl --json get -p aB3kL9mX xK9mQ2vLpA {"ok":true,"filename":"report.pdf","size":2097152,"saved_to":"/home/user/report.pdf"} # 오류는 ok:false를 반환합니다 {"ok":false,"error":"Link not found"}
--json 모드에서 모든 출력은 stdout의 구조화된 JSON입니다. 전송 시 비밀번호가 제공되지 않으면 자동으로 생성되어 응답에 포함됩니다. 종료 코드는 성공 시 0, 오류 시 1입니다.
Orbit은 더 큰 파일(10 GB), 더 긴 보존 기간(30일), 파일 관리(목록 및 삭제)를 제공합니다.
API 키는 자동 감지됩니다: TTL_API_KEY 환경 변수, 바이너리 옆의 ttl.key 또는 ~/.ttl/key. ttl activate로 키를 저장하거나 이 위치 중 하나에 수동으로 작성하세요.
# 키 활성화 $ ttl activate ttl_orbit_aBcDeFgHiJ... Orbit plan activated. Key saved to /usr/local/bin/ttl.key # 플랜 및 사용량 확인 $ ttl plan Plan: orbit Max file size: 10.0 GB Max TTL: 30 days Uploads per day: Unlimited Usage: Uploads today: 3 Active storage: 1.2 GB / 250.0 GB # 연장된 TTL로 전송 $ ttl send -t 30d large-backup.tar.gz # 최근 업로드 목록 $ 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
ttl send / ttl get 또는 --json 모드를 사용하세요. 아래 엔드포인트는 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}]}
이 키로 업로드된 모든 파일을 반환합니다. 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 | 요청 제한 초과 |
| 제한 | 무료 | Orbit |
|---|---|---|
| 최대 파일 크기 | 2 GB | 10 GB |
| 최대 TTL | 7일 | 30일 |
| 일일 업로드 | 10 | 50 |
| 스토리지 할당량 | — | 250 GB |
| 목록 및 삭제 | — | ✓ |
| 최소 비밀번호 길이 | 8자 | |
| IP당 요청 | 10초당 30 | |
| IP당 연결 | 동시 10 | |
파일은 업로드 전에 기기에서 암호화됩니다. 서버는 암호문만 저장하며 파일을 복호화할 수 없습니다.
| 구성 요소 | 알고리즘 / 값 |
|---|---|
| 키 도출 | Argon2id (time=3, memory=64 MB, parallelism=1) |
| 암호 | XChaCha20-Poly1305 AEAD |
암호문에 대한 어떤 수정이든 복호화 실패를 유발합니다. 서버는 암호화 키에서 파생된 단방향 토큰을 사용하여, 다운로드하는 사람이 올바른 비밀번호를 알고 있는지 확인한 후에 암호문을 제공합니다.