Portal
一个用于在任意计算机之间发送文件的命令行文件传输工具
安装
在 macOS/Linux 上,如果你使用 Homebrew
brew install portal
在 Windows 上,如果你使用 Scoop
scoop install portal
在 Windows 上,如果你使用 WinGet
winget install SpatiumPortae.portal
在 Arch Linux 上 (AUR)
yay -S portal-bin
在任何平台上,你都可以手动获取最新版本,或者直接运行
curl -sL portal.spatiumportae.com | bash
或
wget -qO - portal.spatiumportae.com | bash
工作原理
发送文件和文件夹
发送文件:
portal send <文件1> <文件2> <文件夹1> <文件夹2> ...
应用程序将输出一个临时密码,格式为 1-inertia-elliptical-celestial
。
发送方将通过某种安全渠道将此密码传达给接收方。
接收文件和文件夹
接收这些文件:
portal receive 1-intertia-elliptical-celestial
两个客户端将通过中继服务器建立连接。然后,文件传输将根据可能的情况进行直接或中继连接。
界面展示 ✨
发送方**(上方)向接收方(下方)发送一个文件夹和三个文件。
在这种情况下,正如你在事件日志中所看到的,传输是使用直接传输完成的。这意味着
文件是直接**从一个客户端发送到另一个客户端的,不涉及任何中间人。
实际上,这些计算机位于同一局域网中,portal
识别到了这一点。
特性
portal
提供:
- 使用 PAKE2 的端到端加密
- 如果可能,直接传输文件(例如,发送方和接收方在同一局域网中)
- 如果发送方和接收方无法直接连接,则回退到中继服务器
- 并行 gzip 压缩文件,实现更快、更高效的传输
- 自主托管中继服务器(如果你计划发送大量数据,我们将不胜感激!)
- 可配置性和 shell 补全
- 一个闪亮的用户界面 ⭐✨ 让你在等待文件时赏心悦目
补全
portal
为以下 shell 提供广泛的 TAB 补全:
bash
zsh
fish
powershell
要查看适用于你的 shell 和平台的安装说明,请运行:
portal completion [bash|zsh|fish|powershell] --help
小贴士!
你可能没有_完全_听清 Bob 在房间另一头喊出的密码。
你可以在接收端使用 TAB 补全来自动完成密码。
在输入密码的部分时按 TAB...
portal receive 42-relative-parsec-s...
...portal
将会建议可能的单词
$ portal receive 42-relative-parsec-s...
42-relative-parsec-supernova 42-relative-parsec-scatter 42-relative-parsec-solar 42-relative-parsec-spin 42-relative-parsec-static
42-relative-parsec-sigma 42-relative-parsec-solid 42-relative-parsec-star 42-relative-parsec-storm 42-relative-parsec-system
嘭. supernova.
portal receive 42-relative-parsec-supernova
标志
接收方
-y/--yes
:覆盖现有文件,无需[Y/n]
提示
中继
-p/--port
:用于托管中继服务器的端口
发送方
和 接收方
-r/--relay
:中继服务器的地址(:8080
、myrelay.io:1234
等)-s/--tui-style
:TUI 的样式(rich
|raw
)
发送方
、接收方
和 中继
-h/--help
:输出任何命令的帮助信息-v/--verbose
:将调试信息记录到文件
配置
portal
将其配置文件放在 $HOME/.config/portal/config.yml
中。
显然,从文件扩展名可以看出,配置是一个简单的 YAML 文件,带有描述性的字段名称。
默认配置
# 中继服务器的 URL。
relay: portal.spatiumportae.com
# 将调试输出记录到文件。
verbose: false
# 接收文件时提示是否覆盖重复文件。
prompt_overwrite_files: true
# 使用 "portal serve" 提供中继服务时使用的端口。
relay_serve_port: 8080
# TUI 的样式。
tui_style: rich
托管您自己的中继服务器
portal
二进制文件内置了一个中继服务器。
启动您自己的中继服务器非常简单...
portal serve --port 1337
服务器日志输出为 JSON
格式。强烈建议通过 jq 运行它!
portal serve --port 1337 2>&1 | jq .
...
{
"level": "info",
"ts": "2023-02-28T02:57:45.310134+01:00",
"caller": "rendezvous/server.go:77",
"msg": "serving rendezvous server",
"version": "v1.2.1",
"address": ":1337"
}
连接过程的更多细节
技术细节
技术细节
发送方和服务器之间的连接是通过中间服务器(中继)协商的。
中继服务器用于协商安全加密通道,同时不会看到文件内容或临时密码。
通信过程如下:
发送方
连接到中继
中继
为发送方分配一个数字 ID 并发送给发送方
发送方
生成并输出密码(以 ID 开头)到终端,对密码进行哈希处理并发送给中继
接收方
对密码(通过某种安全渠道传达)进行哈希处理并发送给中继
- 当
发送方
和接收方
都向中继
发送了哈希密码后,加密交换开始 - 在加密交换过程中,
中继
负责转发发送方
和接收方
之间的消息 - 一旦加密交换完成,
发送方
和接收方
发送的每条消息都会被加密,中继
无法看到其内容 - 文件传输即将开始,可以通过两种方式进行:
发送方
和接收方
在同一本地网络中,或者可以通过 IP 直接访问- 在这种情况下,
发送方
和接收方
将直接相互发送文件。中继
将关闭此连接。
- 在这种情况下,
发送方
和接收方
不在同一本地网络中,或无法直接相互访问。传输将通过中继
进行,中继
将继续转发加密消息,直到文件传输完成
从源代码构建
Makefile
包含了您所需的一切。
要构建包含所有命令的二进制文件,运行:
PORTAL_VERSION=v1.x.x make build
包含 PORTAL_VERSION
很重要,它是一个 语义版本 字符串。这是为了验证发送方和接收方与中继服务器的兼容性,例如,当主版本号不同时,禁止传输。
维护者
致谢
非常感谢 magic-wormhole,它极大地启发了 Portal 的概念。
nhooyr/websocket、shollz/pake、charmbracelet/bubbles、charmbracelet/bubbletea、charmbracelet/lipgloss、muesli/reflow、klauspost/pgzip 以及许多其他项目。
DigitalOcean <3
特别感谢我们的赞助商 DigitalOcean。
所有人都可以使用的公共中继服务器由以下提供支持...