从手机发送文件到服务器、NAS 或树莓派
最近核对
大多数浏览器文件分享工具,都要求接收端开着一个浏览器标签页。而家用服务器、NAS、树莓派或云主机没有屏幕,也没有浏览器。tosstome 的命令行收件箱正是为这样的机器设计的。
设置收件箱
在服务器上运行(需要 Node.js 22 或更高版本):
tosstome listen --dir /srv/inbox
它会在终端里输出一个链接和一个二维码:
- 用手机扫描二维码,或者把链接复制到手机上。
- 把这个页面添加到手机主屏幕。
- 打开它,选好文件,按发送。文件会写入
/srv/inbox。
手机和服务器在同一网络时,文件通过该网络直接传给服务器,不会离开这个网络。在其他任何地方,网络条件允许时直接传输,否则经过一个不保留任何内容的中继。
收件箱链接在重启后保持不变,所以主屏幕上的图标一直有效。之后想再次显示链接,运行 tosstome url。想丢弃旧链接并生成新的,运行 tosstome listen --new。
收件箱如何受到保护
- 链接中
#后面带有一个秘密的发送密钥。浏览器在请求页面时不会把链接的这一部分发给服务器,密钥是之后在 WebSocket 连接中传递的。 - 服务器只保存这些密钥的 SHA-256 哈希值。
- 服务器端使用一个独立的代理密钥,它不会离开
~/.config/tosstome/inbox.json。 - 发送密钥错误时,被锁定的是发送方,而不会影响服务器自己的连接。
- 发送方提供的文件名会被简化为目标文件夹内的纯文件名。文件在写入时以
.part结尾,完成后再重命名,所以监视该文件夹的脚本永远不会看到写了一半的文件。
在本地网络中也可见
tosstome listen --nearby
加上 --nearby 后,这台服务器也会出现在同一网络中浏览器的“附近”列表里,所以家里的任何人不需要链接就能发给它。这些文件会放进单独的 nearby/ 子文件夹,因为该网络中的任何人都可以发送。
作为服务运行
对于需要一直接收文件的机器,可以让它在你用来守护其他服务的工具下运行,比如 systemd 单元、Docker 容器或 tmux。加上 --json,每行会输出一个 JSON 事件(ready、offer、file、error),便于记录日志或供脚本使用。
[Unit]
Description=tosstome inbox
After=network-online.target
[Service]
ExecStart=/usr/bin/env tosstome listen --dir /srv/inbox --json
Restart=always
User=media
[Install]
WantedBy=multi-user.target
从另一台电脑的终端发送
tosstome send report.pdf photos.zip --to "INBOX_LINK"
请给链接加上引号,因为其中的 # 在 shell 中会被当作注释。
常见问题
服务器需要公网 IP 或开放端口吗?
不需要。收件箱会主动向 toss2.me 发起一个出站 WebSocket 连接并在那里等待,所以在家用路由器、NAT 以及允许出站 HTTPS 的防火墙后面都能使用。
在家里,文件会经过互联网吗?
不会。只有简短的连接建立过程会经过 toss2.me。手机和服务器在同一网络时,文件通过 WebRTC 在两者之间直接传输,所以速度受限于你的 Wi-Fi 或以太网。页面会显示这次传输是直连还是经过了中继。
我发送时服务器不在线会怎样?
不会发送任何内容,也不会存储任何内容。手机页面会提示收件箱已离线。
别人能往我的收件箱发文件吗?
只有拿到链接的人可以。如果链接泄露了,运行 tosstome listen --new 来替换它,旧链接就会失效。
文件大小有限制吗?
tosstome 没有设置大小限制。接收端的浏览器会把文件放在内存中,直到你保存,所以对于几个 GB 的文件,命令行收件箱是更好的接收方式,因为它会直接写入磁盘。