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

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

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

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

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

Цель состоит в том, чтобы уйти от скрипта Perl и реализовать функциональность в bash.

благодаря

С libcurl с поддержкой sftp :

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

Я испытал завиток в этих дистрибутивах Linux / Unix:

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

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

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

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

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

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

Кроме того, смонтируйте удаленную файловую систему через SSHFS , а затем получите доступ к ней с помощью любой команды, такой как 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")