我有一个 HTTPS 的 REST-API 服务器。我需要一种在使用 SFTP 检索文件时调用 API 的方法。内容是每个请求动态生成的。有没有一种简单的方法可以做到这一点,而不必添加用户帐户并在服务器上引入安全漏洞?拥有密钥将允许任何人获取文件的内容,但仅此而已。
这就是我所拥有的:
GET https://myservice/api/items/get?key=XXXX
这样做将返回相同的结果:
sftp XXXX@myservice:/items (or sftp myservice:/items/XXXX)
答案1
我思考我明白你的意思。你想根据当前用户(或请求的文件)生成文件。你目前通过 HTTPS 执行此操作,但你还想通过 SFTP 提供它... 对吗?有趣的问题。
您可能会感到震惊,我认为没有任何东西可以满足您的要求......但一切皆有可能。
我的第一个方法是编写您自己的文件系统!
我会从 FUSE 开始。此外,还有 python-fuse。以下是我用过的唯一教程对于 FUSE。它将带您到达可以开始编辑内容的地步。我会:
- 让它只列出一个[假]文件
readdir()
- 弄清楚如何从文件系统中找到用户名
- Hotwire
open()
并使用用户名read()
从中提取requests.get('your URL')
。open()
可能只需要伪造并read()
处理请求requests
。 - 你可能需要修补和伪造许多其他方法,以便它们返回数据,但显然大多数情况下都是伪造的
- 将此 FUSE 文件系统挂载到 SFTP 中的某个位置,每个人都可以将其视为只读
这对于任何一种 sftp 方法都有效(例如,您可以查看完整路径而不是用户),但您需要一个人们可以登录的单个 sftp 帐户。
或者,如果每个用户都有一个帐户,您可以尝试监视每个用户拥有的目录的访问。inotifywatch
并且inotifywait
可以让您监视对目录的访问。
inotifywait -mrq --format '%w' /home/*/magicdir/ | while read DIR; do
user=${DIR:6:-10} # that is based on the length of /home/ and /magicdir/
wget -qO $DIR https://path/to/items/${user}
done
并让它在后台运行。每次他们访问目录时,它都会从网站更新文件。您可能需要检查它(使用echo blaaa $DIR
)以确保它不会破坏服务器。他们第一次加载目录时,它可能不会显示文件。