Получать файлы с SFTP-сервера и манипулировать ими в памяти

Получать файлы с SFTP-сервера и манипулировать ими в памяти

Есть лиБАШспособ, который позволяет получить доступ к SFTP-серверу, «получить доступ» к файлу и, не загружая его, прочитать его вбуфер, манипулировать содержимым и затем сохранять его локально.

Я знаю, что это можно сделать с помощью скрипта Perl.

@file=$sftp->get($file);

Я ищу аналогичный подход в bash.

Цель — уйти от скриптов Perl и реализовать функционал на bash.

Спасибо

решение1

Сlibcurl с sftpподдерживать:

 curl sftp://sftp.example.com -o - | do_some_magic > filename


Я протестировал curl на следующих дистрибутивах Linux/Unix:

libcurl со встроенной поддержкой sftp: RHEL6, RHEL7

Без: RHEL5, Ubuntu 11.04, Ubuntu 14.04, Solaris 11

решение2

Вы не можете получить доступ к удаленному файлу, не загрузив его, но вы можете загрузить удаленный файл, не сохраняя его в локальной файловой системе. Не с помощью самого bash, который не включает поддержку SFTP, а с помощью утилит командной строки.

Клиент sftpOpenSSH, похоже, не может этого сделать: он настаивает на получении доступного для поиска расположения выходных данных, что исключает возможность передачи его в подстановку команд.

Curl может загрузить файл на стандартный вывод, но он не всегда поддерживает SFTP (он изначально был HTTP-загрузчиком).

Поскольку вы уже знаете, как это сделать в Perl, вы можете просто запустить Perl.

В качестве альтернативы можно смонтировать удаленную файловую систему поверхСШФС, а затем получить к нему доступ с помощью любой команды, например cat.

mkdir foo
sshfs example.com:/path/to/directory foo
content=$(cat foo/somefile)
fusermount -u foo
rmdir foo

В качестве альтернативы, делайте все «нормальным» способом оболочки. Оболочки не предназначены для выполнения сложных манипуляций данными в памяти, они в основном хороши для выполнения других команд и работы с файлами. Работа с содержимым файлов обычно включает конвейеры и, иногда, временные файлы.

my_tmp_dir=
trap 'rm -rf "$my_tmp_dir"' EXIT INT HUP
my_tmp_dir=$(mktemp -d)
echo 'get remotefile localfile' | { cd "$my_tmp_dir" && sftp -q; }
content=$(cat "$my_tmp_dir/localfile")

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