Obtém arquivos do servidor SFTP e manipula na memória

1

Existe uma maneira BASH que é capaz de acessar um servidor SFTP, "acessar" um arquivo e sem baixá-lo lê-lo em um buffer , manipular o conteúdo e então 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

    
por PackedUp 08.01.2015 / 19:18

2 respostas

2

Com suporte a libcurl com sftp :

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

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

libcurl com suporte sftp integrado: RHEL6, RHEL7

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

    
por 08.01.2015 / 19:21
0

Você não pode acessar um arquivo remoto sem baixá-lo, mas pode baixar 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 cliente sftp do OpenSSH não parece ser capaz de fazer isso: ele insiste em obter um local de saída pesquisável, o que exclui sua colocação em uma substituição de comando.

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

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

Como alternativa, monte o sistema de arquivos remoto pelo SSHFS e 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

Como alternativa, faça as coisas do jeito "normal". Shells não são projetados para manipular dados de fantasia na memória, eles são bons em 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")
    
por 09.01.2015 / 00:48