O SCP não é adequado para o seu objetivo. O protocolo SCP não suporta o envio de um fluxo de bytes de tamanho desconhecido para o sistema remoto a ser salvo como um arquivo. A mensagem do protocolo SCP para enviar um arquivo requer que o tamanho do arquivo seja enviado primeiro, seguido pelos bytes que compõem o arquivo. Com um fluxo de bytes lidos a partir de um pipe, você normalmente não saberia quantos bytes o pipe produzirá, portanto não há como enviar uma mensagem do protocolo SCP incluindo o tamanho correto.
(As únicas descrições online do protocolo SCP que encontrei são aqui e aqui . na descrição da mensagem "C".)
O protocolo SFTP pode ser usado para esse tipo de coisa. Tanto quanto eu sei, o utilitário de linha de comando normal sftp
não suporta a leitura de um pipe e o armazena como um arquivo remoto. Mas existem bibliotecas SSH / SFTP para a maioria das linguagens de programação modernas (perl, python, ruby, C #, Java, C, etc). Se você souber como usar um desses idiomas, deve ser fácil escrever um utilitário que faça o que você precisa.
Se você está preso a scripts de shell, é possível falsificar o suficiente do protocolo SCP para transferir um arquivo. Aqui está um exemplo:
#!/bin/bash
cmd='cat /etc/group'
size=$($cmd | wc -c)
{
echo C0644 $size some-file
$cmd
echo -n -e '#!/bin/bash
cmd='cat /etc/group'
size=$($cmd | wc -c)
{
echo C0644 $size some-file
$cmd
echo -n -e '%pre%0'
} | ssh user@host scp -v -p -t /some/directory
0'
} | ssh user@host scp -v -p -t /some/directory
Isso criará some-file
em /some/directory
no sistema remoto com permissões 644. O conteúdo do arquivo será o que for que $cmd
grava em sua saída padrão. Observe que você está executando o comando duas vezes, com qualquer consumo de recursos e efeitos colaterais que isso implique. E o comando deve produzir o mesmo número de bytes de cada vez.