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次下载
490KB
3K SLoC
asfa
- 避免发送文件附件
不是通过电子邮件附件或直接文件传输,而是通过命令行使用 ssh
将文件上传到您的Web服务器,并通过发送链接代替。链接前缀由上传文件的校验和生成。因此,只有拥有正确链接的人才能访问。
附带一些便捷功能
- 支持在设置的时间后过期链接。
- 链接“直接可用”,对非技术人士友好,但只有拥有链接的人才可访问。
- 不需要在Web服务器上执行任何自定义二进制文件。
- 可选的服务器端依赖项已准备好了(
at
,sha2
)。 - 轻松跟踪当前共享的文件。
- 通过索引、校验和或年龄清理文件。
- 上传后,文件(可选)会验证。
- 支持上传时的别名,因为有时
plot_with_specific_parameters.svg
比简单的plot.svg
描述性更强,特别是几周之后。 - 最重要的是,当然:具有仅用左手在基准行上即可键入的名称。
asfa
使用每个调用一个单独的 ssh
连接,这在您为每个 ssh-agent 使用启用了确认时很方便(见详情)。或者,可以直接使用 OpenSSH 或 PEM格式 的私钥文件。尽管不应该这样做,但也接受明文密码。
要求
一个可以通过 ssh 访问的远程服务器
- 运行着Web服务器
- 您的用户目录下有一个由您的Web服务器提供服务的文件夹
- (可选) 安装了与
sha2
相关的哈希工具(sha256sum/
sha512sum
) - (可选) 安装了
at
以支持过期链接。
使用方法
注意:所有命令都可以缩写
p
→push
l
→list
ch
→check
cl
→clean
v
→verify
推送
将本地文件上传到远程站点并打印其可访问的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软件包提供
或者使用您喜欢的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 在远程服务器上处理电子邮件(向 neomutt、OfflineIMAP 和 msmtp 致敬),我需要一个快速简单的方法将文件附加到电子邮件中。由于电子邮件附件是不受欢迎的,我不想简单地将文件复制到远程站点以附加它们。此外,我经常需要在我们的小组内部 mattermost 或其他任何基于文本的通信方式上共享生成的文件(如图表或日志文件)。理想情况下,我希望从终端中我正在的文件夹中这样做——而不是从浏览器的“文件打开”菜单中导航回它…
作为编写 rust 的一个小练习(除了 Advent of Code),我将我使用了几年的一个小 python 脚本 移植过来。
出于 安全原因,我将我的 gpg-agent
(作为 ssh-agent
行动)设置为在连接到远程服务器时 确认 每次使用,之前的破解需要三个连接(和确认)来完成其任务。asfa
被设置为每次调用只使用一个 ssh 连接。
许可
许可协议为以下之一
- Apache许可证,版本2.0(LICENSE-APACHE或http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(《LICENSE-MIT》或http://opensource.org/licenses/MIT)
由您选择。
依赖项
~13–26MB
~337K SLoC