como enviar dados para conexão sftp?

9

O ftp suporta o comando put "|..." "remote-file.name" para enviar dados para uma conexão ftp. Existe algo similar disponível para o sftp?

No sftp eu recebo o seguinte erro:

sftp 'jmw@backupsrv:/uploads'
sftp> put "| tar -cx /storage" "backup-2012-06-19--17-51.tgz"
stat | tar -cv /storage: No such file or directory

como acima, o cliente sftp obviamente não executa o comando.

Eu quero usar o comando pipe para redirecionar diretamente o fluxo de arquivos para o sftp. (porque não há espaço suficiente para criar um arquivo de backup no mesmo disco antes de fazer o upload para o servidor sftp.)

    
por JMW 19.06.2012 / 18:03

4 respostas

1

voretaq7 apontou que o cliente sftp não suporta transferência de dados canalizada para usuários, que podem usar o sftp apenas para se conectar ao servidor.

felizmente, existe o libssh2, que suporta o sftp. então nós só precisamos de 2 outros clientes usando o libssh2, que eu chamei:

  • sftp_stdin_upload (para fazer upload para um servidor sftp)
  • sftp_stdout_download (para baixar de um servidor sftp)

o código-fonte pode ser encontrado no seguinte URL: link

desde que eu não sou tão experiente na programação libssh2, estou feliz por qualquer feedback para o código-fonte.

    
por 05.07.2012 / 13:18
2

output-stream-generating-command | ssh user@remotehost 'input-stream-accepting-command' é uma opção, se o seu usuário remoto tiver um shell válido.

    
por 19.06.2012 / 18:42
2

Eu me diverti muito tentando descobrir uma solução para esse problema. Requer a ferramenta nc (netcat) em ambas as máquinas e o SSH (SFTP não é necessário).

Neste exemplo, chamarei a máquina que possui os dados que precisam fazer o backup do linux-a e a máquina que precisa receber o backup linux-b.

No linux-a, tenha o netcat listen em uma porta (peguei 2000) e redirecione-o para um arquivo. Isso só vai ficar lá e esperar até que algo chegue nessa porta.

[kenny@linux-b /var/backups]$ nc -l 2000 > backup.tgz

No linux-b, abra um túnel ssh para o linux-a, usei a porta 2000 novamente. Isso redirecionará qualquer coisa que você lançar na porta TCP 2000 no localhost para a porta TCP 2000 no linux-a, onde o netcat está escutando.

[kenny@linux-a /var/data]$ ssh -L 2000:localhost:2000 -CfN linux-b

Agora crie o arquivo tar, mas envie a saída para stdout (usando -) e canalize para gzip para alguma compactação. Agora canalize isso para outro netcat que o envia para localhost no TCP na porta 2000.

[kenny@linux-a /var/data]$ tar cf - important-data | gzip -fc | nc localhost 2000

Terminamos! No linux-b, o netcat não está mais atendendo e um novo arquivo é criado. A melhor parte é que o arquivo tar nunca foi colocado no disco rígido do linux-a.

[kenny@linux-b /var/backups]$ file backup.tgz 
backup.tgz: gzip compressed data, from Unix, last modified: Thu Jul  5 13:48:03 2012

Eu sei que não é exatamente o que você pediu na pergunta, mas se você tiver o netcat disponível, é uma solução viável para o seu tipo de problema.

Editar: Esqueci de uma coisa: se você seguir estas instruções, ainda terá um túnel SSH flutuando no linux-a. Descubra qual é o ID do processo e mate-o.

[kenny@linux-a /var/data]$ ps -ef | grep "ssh -L"
kenny     5741     1  0 13:40 ?        00:00:00 ssh -L 2000:localhost:2000 -CfN linux-b
kenny     5940  3360  0 14:13 pts/1    00:00:00 grep --color=auto ssh -L
[kenny@linux-a /var/data]$ kill 5741
    
por 05.07.2012 / 14:03
1

Como este é o primeiro resultado que você encontrou pesquisando essa questão e ela não foi mencionada, adicionarei a solução que encontrei aqui também:

você pode usar a implementação curls sftp para isso. Como o curl provavelmente já está instalado em muitos sistemas, isso pode ser preferível à solução usando clientes personalizados.

uso de exemplo:

pg_dump -d database | pigz -1 | curl -u username -T - sftp://sftpserver/folder/dbbackup.sql.gz

curl usa seu arquivo .ssh/known_hosts para a verificação da chave. Isso pode falhar no caso de seu cliente ssh usar padrões de criptografia mais recentes não suportados pela biblioteca usada no curl

para corrigir isso, você pode adicionar os outros tipos de chave ao arquivo de hosts conhecidos usando o seguinte comando:

ssh-keyscan sftpserver >> ~/.ssh/known_hosts

ou você pode desabilitar a verificação da chave usando o sinal -k (eu não recomendaria isso)

    
por 05.10.2018 / 15:32

Tags