#文件上传 #SSH #文件 #上传 #邮件 #CLI文件 #密钥文件

app asfa

通过SSH将文件上传到具有不可猜测(基于哈希)前缀的远程站点,并打印URL,避免发送文件附件

24个版本

0.10.0 2024年5月27日
0.9.1 2021年12月28日
0.9.0 2021年8月3日
0.8.0 2021年6月15日
0.5.4 2020年11月15日

#191命令行工具

每月44次下载

MIT/ApacheCC-PDDC 许可证

490KB
3K SLoC

asfa - 避免发送文件附件

Crates.io AUR version AUR version AUR version Changelog GitHub commits since tagged version
GitHub Workflow Status dependency status Rustdoc Crates.io

不是通过电子邮件附件或直接文件传输,而是通过命令行使用 ssh 将文件上传到您的Web服务器,并通过发送链接代替。链接前缀由上传文件的校验和生成。因此,只有拥有正确链接的人才能访问。

附带一些便捷功能

  • 支持在设置的时间后过期链接。
  • 链接“直接可用”,对非技术人士友好,但只有拥有链接的人才可访问。
  • 不需要在Web服务器上执行任何自定义二进制文件。
  • 可选的服务器端依赖项已准备好了(atsha2)。
  • 轻松跟踪当前共享的文件。
  • 通过索引、校验和或年龄清理文件。
  • 上传后,文件(可选)会验证
  • 支持上传时的别名,因为有时 plot_with_specific_parameters.svg 比简单的 plot.svg 描述性更强,特别是几周之后。
  • 最重要的是,当然:具有仅用左手在基准行上即可键入的名称。

asfa 使用每个调用一个单独的 ssh 连接,这在您为每个 ssh-agent 使用启用了确认时很方便(见详情)。或者,可以直接使用 OpenSSH 或 PEM格式 的私钥文件。尽管不应该这样做,但也接受明文密码。

要求

一个可以通过 ssh 访问的远程服务器

  • 运行着Web服务器
  •  
  • 您的用户目录下有一个由您的Web服务器提供服务的文件夹
  • (可选) 安装了与 sha2 相关的哈希工具(sha256sum/sha512sum
  • (可选) 安装了 at 以支持过期链接。

使用方法

注意:所有命令都可以缩写

  • ppush
  • llist
  • chcheck
  • clclean
  • vverify

推送

将本地文件上传到远程站点并打印其可访问的URL。

$ asfa push my-file.txt
https://my-domain.eu/asfa/V66lLtli0Ei4hw3tNkCTXOcweBrneNjt/my-very-specific-file.txt

请参阅上面的示例。由于文件是通过其哈希值来识别的,因此上传相同的文件两次将生成相同的链接。

使用别名推送

将文件以不同的名称推送到服务器。如果您想以通用名称共享日志文件或绘图,这非常有用。

请注意,如果您指定了多个文件并为其指定了各自的别名,则需要显式指定参数。

或者之后指定别名。

$ asfa push my-file.txt my-file-2.txt --alias my-very-specific-file.txt my-very-specific-file-2.txt
https://my-domain.eu/asfa/V66lLtli0Ei4hw3tNkCTXOcweBrneNjt/my-very-specific-file.txt
https://my-domain.eu/asfa/HiGdwtoXcXotyhDxQxydu4zqKwFQ-9pY/my-very-specific-file-2.txt

自动过期

可以通过 --expire <延迟> 在一定时间后自动过期上传(<延迟> 可以是几分钟到几小时,甚至几天或几个月)。这需要远程站点已安装并运行 at

列表

列出当前所有可用的在线文件

详细信息列表

通过 --details 列出所有文件及其元数据

检查

检查文件是否已上传(通过哈希值)并打印它们。

清理

通过索引从远程站点删除文件(负索引 不再 需要与 -- 分隔)

您也可以通过指定 --file 来确保删除特定的文件

请注意,即使文件是通过别名上传的,也会删除该文件。

验证

如果上传提前取消,可以通过 verify 检查所有文件的有效性

$ asfa verify
✓ my-very-specific-file.txt ..... Verified.
✓ my-very-specific-file-2.txt ... Verified.

由于前缀是校验和,因此即使文件不存在本地,也可以执行检查。

按上传日期过滤

所有命令都接受一个 --newer/--older <n>{min,hour,day,week,month} 参数,用于缩小文件数量。

例如,可以通过以下方式清理一个月前的所有文件

$ asfa clean --older 1month
$ asfa clean --older 1M

可以通过以下方式列出过去五分钟内上传的所有文件

$ asfa list --newer 5min
$ asfa list --newer 5m

重命名已上传文件

可以通过 rename 命令(缩写 mv)在事后重命名上传的文件。远程文件可以通过索引(由 list 返回)或指定要重命名的本地文件来指定。

$ asfa rename -1 foobar
┌┤Renaming:├────────────────────────────────────────────────────────────────────────┐
│ my-very-specific-file-2.txt → https://breitwieser.eu/asfa/6x-SVlgRJn39wpsV/foobar │
└───────────────────────────────────────────────────────────────────────────────────┘

安装

cargo

$ cargo install asfa

AUR

以下AUR软件包提供

  • asfa:从源构建的最新稳定版本。
  • asfa-bin 针对目标 x86_64-unknown-linux-gnu 的预构建二进制文件。
  • asfa-git 当前开发快照,从源代码构建。

或者使用您喜欢的AUR助手或手动安装

$ cd <temporary folder>
$ curl -o PKGBUILD https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=asfa-git
$ makepkg
[...]
==> Finished making: asfa-git 0.7.2.r16.g763f726-1 (Sun 07 Feb 2021 04:18:12 PM CET)
$ sudo pacman -U asfa-git-0.7.2.r16.g763f726-1-x86_64.pkg.tar.zst

从源代码

$ git clone https://github.com/obreitwi/asfa.git
$ cargo install --path asfa

配置

配置位于 ~/.config/asfa/config.yaml。针对特定主机的配置也可以拆分为位于 ~/.config/asfa/hosts/<别名>.yaml 下的单个文件。

系统范围的配置可以放在 /etc/asfa 中,文件夹结构相同。

示例配置可以在 ./example-config 中找到。在此,我们假设您的服务器可以通过 https://my-domain.eu 访问,并且文件夹 /var/wwww/default/asfa 将在 https://my-domain.eu/asfa 上提供。

asfa 方面

一个完整注释的示例配置可以在 这里 找到。

最小化(单文件): ~/.config/asfa/hosts/my-remote-site.yaml

hostname: my-hostname.eu  # if not specified, will defaulted from ssh or filename
folder: /var/www/default/asfa
url: https://my-domain.eu/asfa
group: www-data

完整(单文件): ~/.config/asfa/config.yaml

default_host: my-remote-site
details: true  # optional, acts as if --details is given
prefix_length: 32
verify_via_hash: true
auth:
  interactive: true
  use_agent: true
hosts:
  my-remote-site:
    # note: port is optional, will be inferred form ssh and defaults to 22
    hostname: my-hostname.eu:22
    folder: /var/www/default/asfa
    url: https://my-domain.eu/asfa
    group: www-data
    auth:
      interactive: false
      use_agent: true
      private_key_file: /path/to/private/key/in/pem/format #optional

Web 服务器

无论您使用哪个 Web 服务器,您都必须确保满足以下要求

  • 上传文件的用户需要对其配置的 文件夹 具有写权限。
  • 您的 Web 服务器需要在 url 上提供 文件夹
  • 如果您不希望上传的数据对所有人可读,请将 group 设置为您的 Web 服务器所在的组。
  • 确保您的 Web 服务器不会提供 文件夹 的索引,否则任何访客都可以很容易地看到所有上传的文件。

Apache

您的 Apache 配置可以非常简单

<Directory /var/www/default/asfa>
  Options None
  allow from all
</Directory>

确保 Options 不包含 Indexes,否则任何访客都可以非常容易地访问所有上传的文件!

nginx

location /asfa {
  autoindex off
}

背景

由于我主要通过 ssh 在远程服务器上处理电子邮件(向 neomuttOfflineIMAPmsmtp 致敬),我需要一个快速简单的方法将文件附加到电子邮件中。由于电子邮件附件是不受欢迎的,我不想简单地将文件复制到远程站点以附加它们。此外,我经常需要在我们的小组内部 mattermost 或其他任何基于文本的通信方式上共享生成的文件(如图表或日志文件)。理想情况下,我希望从终端中我正在的文件夹中这样做——而不是从浏览器的“文件打开”菜单中导航回它…

作为编写 rust 的一个小练习(除了 Advent of Code),我将我使用了几年的一个小 python 脚本 移植过来。

出于 安全原因,我将我的 gpg-agent(作为 ssh-agent 行动)设置为在连接到远程服务器时 确认 每次使用,之前的破解需要三个连接(和确认)来完成其任务。asfa 被设置为每次调用只使用一个 ssh 连接。

许可

许可协议为以下之一

由您选择。

依赖项

~13–26MB
~337K SLoC