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.)
Respostas:
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.
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.
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.
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.
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.
fonte
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:
curl
usa seu.ssh/known_hosts
arquivo 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 curlPara corrigir isso, você pode adicionar os outros tipos de chave ao arquivo hosts conhecido usando o seguinte comando:
ou você pode desativar a verificação de chave usando a
-k
bandeira (embora eu não recomendo isso)fonte
output-stream-generating-command | ssh user@remotehost 'input-stream-accepting-command'
é uma opção, se o usuário remoto tiver um shell válido.fonte
this
vez disso". - isso me parece um daqueles momentos.S
bit 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 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:
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.
fonte