
我有一個 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 提供它...對嗎?有趣的問題。
您可能會感到震驚,因為我認為沒有任何東西可以滿足您開箱即用的要求……不過,一切皆有可能。
我的第一個方法是編寫自己的檔案系統!
我會從保險絲開始。此外,python-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
)以確保它不會對伺服器造成影響。第一次載入目錄時可能不會顯示檔案。