Есть лиБАШспособ, который позволяет получить доступ к 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, а с помощью утилит командной строки.
Клиент sftp
OpenSSH, похоже, не может этого сделать: он настаивает на получении доступного для поиска расположения выходных данных, что исключает возможность передачи его в подстановку команд.
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")