Obtenha arquivos do servidor SFTP e manipule na memória

Obtenha arquivos do servidor SFTP e manipule na memória

Tem algumaBASHmaneira que é capaz de acessar um servidor SFTP, "acessar" um arquivo e sem baixá-lo lê-lo em umamortecedor, manipule o conteúdo e armazene-o localmente.

Eu sei que isso pode ser feito usando um script perl.

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

Estou procurando uma abordagem semelhante no bash.

A intenção é fugir do script Perl e implementar a funcionalidade no bash.

Obrigado

Responder1

Comlibcurl com sftpapoiar:

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


Eu testei o curl nestas distribuições Linux/Unix:

libcurl com suporte sftp integrado: RHEL6, RHEL7

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

Responder2

Você não pode acessar um arquivo remoto sem baixá-lo, mas pode fazer download de um arquivo remoto sem salvá-lo no sistema de arquivos local. Não com o próprio bash, que não inclui suporte para SFTP, mas com utilitários de linha de comando.

O sftpcliente do OpenSSH não parece ser capaz de fazer isso: ele insiste em obter um local de saída pesquisável, o que exclui canalizá-lo para uma substituição de comando.

Curl pode baixar um arquivo para saída padrão, mas nem sempre é construído com suporte a SFTP (começou como um downloader HTTP).

Como você já sabe como fazer isso em Perl, você pode simplesmente executar o Perl.

Alternativamente, monte o sistema de arquivos remoto sobreSSHFSe acesse-o com qualquer comando como cat.

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

Alternativamente, faça as coisas da maneira “normal” do shell. Os shells não são projetados para manipulações sofisticadas de dados na memória; eles são principalmente bons para executar outros comandos e trabalhar com arquivos. Trabalhar com conteúdo de arquivo normalmente envolve pipelines e, às vezes, arquivos temporários.

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

informação relacionada