SFTP-сервер должен ответить HTTPS-файлом

SFTP-сервер должен ответить HTTPS-файлом

У меня есть сервер REST-API по HTTPS. Мне нужен способ вызвать API при извлечении файла с помощью SFTP. Содержимое динамически генерируется по запросу. Есть ли простой способ сделать это без необходимости добавлять учетные записи пользователей и вносить дыры в безопасность на сервере? Наличие ключа позволит любому получить содержимое файла, но ничего больше.

Вот что у меня есть:

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), чтобы убедиться, что он не нагружает сервер. Он может не отображать файл при первой загрузке каталога.

Связанный контент