Obtener archivos del servidor SFTP y manipularlos en la memoria

Obtener archivos del servidor SFTP y manipularlos en la memoria

Hay unaINTENTOmanera que es capaz de acceder a un servidor SFTP, "acceder" a un archivo y sin descargarlo leerlo en unbuffer, manipular el contenido y luego almacenarlo localmente.

Sé que esto se puede hacer usando un script en Perl.

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

Estoy buscando un enfoque similar en bash.

La intención es alejarse del script Perl e implementar la funcionalidad en bash.

Gracias

Respuesta1

Conlibcurl con sftpapoyo:

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


He probado curl en estas distribuciones de Linux/Unix:

libcurl con soporte sftp incorporado: RHEL6, RHEL7

Sin: RHEL5, Ubuntu 11.04, Ubuntu 14.04, Solaris 11

Respuesta2

No puede acceder a un archivo remoto sin descargarlo, pero puede descargar un archivo remoto sin guardarlo en el sistema de archivos local. No con bash en sí, que no incluye soporte para SFTP, sino con utilidades de línea de comandos.

El sftpcliente de OpenSSH no parece ser capaz de hacer eso: insiste en obtener una ubicación de salida buscable, lo que excluye canalizarla hacia una sustitución de comando.

Curl puede descargar un archivo a la salida estándar, pero no siempre está construido con soporte SFTP (comenzó como un descargador HTTP).

Como ya sabes cómo hacerlo en Perl, puedes simplemente ejecutar Perl.

Alternativamente, monte el sistema de archivos remoto sobreSSHFSy luego acceda a él con cualquier comando como cat.

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

Alternativamente, haga las cosas de la forma "normal" del shell. Los shells no están diseñados para realizar manipulaciones sofisticadas de datos en la memoria, en su mayoría son buenos para ejecutar otros comandos y trabajar con archivos. Trabajar con contenidos de archivos normalmente implica canalizaciones y, a veces, archivos temporales.

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")

información relacionada