como canalizar dados para conexão sftp?


9

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

No sftp, 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 sftp. (porque não há espaço suficiente para criar um arquivo de backup no mesmo disco antes de carregá-lo no servidor sftp.)


1
Pensei em usar um FIFO para isso, mas nem o SFTP nem o SCP lerão um FIFO.
Tom Anderson

1
também boa ideia, esta é minha: qxs.ch/2012/07/05/sftp-upload-tool
JMW

Respostas:


4

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

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

No linux-a, faça o netcat escutar uma porta (peguei 2000) e redirecione-a para um arquivo. Isso fica parado e espera até que algo chegue nessa porta.

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

No linux-b, abra um túnel ssh no linux-a, usei a porta 2000 novamente. Isso redirecionará qualquer coisa que você lançar na porta TCP 2000 no host local 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 envie-o para o gzip para obter alguma compactação. Agora canalize isso para outro netcat que o envia para o host local no TCP na porta 2000.

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

Foram realizadas! No linux-b, o netcat não está mais ouvindo 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ê tem o netcat disponível, é uma solução viável para o seu tipo de problema.

Edit: Eu esqueci uma coisa: se você seguir estas instruções, você 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

3
Eu gosto dele, mas há 2 problemas: usuários sftponly geralmente não pode usar o encaminhamento de porta e os usuários sftponly não pode acessar nc no servidor SFTP (lembre-se que eles não têm acesso ssh)
JMW

1
Isso é uma crítica totalmente válida.
Kenny Rasschaert

Fora de tópico, mas por que há uma captura de tela do "The Prestige" incorporada neste post?
Rilindo 5/07

4

Como este é o primeiro resultado que você encontra pesquisando no Google para esta pergunta e ainda não foi mencionado, adicionarei a solução que encontrei aqui:

você pode usar a implementação de cachos sftp para isso. Como o curl provavelmente já está instalado em muitos sistemas, isso pode ser preferido para a solução usando clientes personalizados.

exemplo de uso:

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

curlusa seu .ssh/known_hostsarquivo para verificação de chave. Isso pode falhar caso o seu cliente ssh use novos padrões de criptografia não suportados pela biblioteca usada no curl

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

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

ou você pode desativar a verificação de chave usando a -kbandeira (embora eu não recomendo isso)


2

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


5
Este não é o sftp!
21412 jirib

3
@JiriXichtkniha Não, não é, no entanto, o SFTP é quase sempre implementado como um subsistema do seu servidor SSH, e esse é o mais próximo análogo à funcionalidade que vejo sendo solicitada a partir da pergunta (dados de canal através do SFTP a serem manipulados por um programa Na outra extremidade). Às vezes, a resposta é "Você está usando a ferramenta errada - em thisvez disso". - isso me parece um daqueles momentos.
voretaq7

2
O sftp é protol e é diferente de apenas canalizar via ssh, é isso! Sua sugestão não funcionaria se a parte remota fosse apenas SFTP.
jirib

1
Eu não estou autorizado a fazer login como usuário ssh
JMW

1
@JMW, nesse caso, até onde eu sei, você está bem ferrado aqui - nunca vi uma versão do sftp que suporta a canalização para um comando no sistema remoto (provavelmente porque iria derrotar o Sbit ecure deixando alguém entrar sua situação que não possui um shell para executar programas). Eu posso estar errado embora - Eu sou mais familiarizado com a funcionalidade SFTP em OpenSSH eo servidor SSH proprietária Sun usado para enviar ...
voretaq7

1

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

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

  • sftp_stdin_upload (para carregar em um servidor sftp)
  • sftp_stdout_download (para baixar de um servidor sftp)

o código-fonte pode ser encontrado no seguinte URL: http://www.qxs.ch/2012/07/05/sftp-upload-tool/


desde que eu não sou tão experiente em programação libssh2, fico feliz por qualquer feedback sobre o código fonte.


Não funciona para mim :-( / usr / bin / ld: libssh2-1.4.2 / src / .libs / libssh2.a (knownhost.o): referência indefinida ao símbolo 'EVP_sha1' / usr / lib / libcrypto. so.1.0.0: erro ao adicionar símbolos: DSO ausente na linha de comando collect2: erro: o ld retornou 1 status de saída
tobixen

Este código possui apenas um status POC. Sinta-se livre para consertá-lo por conta própria. :-)
JMW 14/06
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.