Observe que não consigo armazenar primeiro o arquivo localmente - é muito grande.
Esta página (desagradável) (role até o fim) parece dar uma resposta, mas estou tendo problemas para desembaraçar a parte específica das unidades de fita:
Para tornar isso mais concreto, veja como você acha que isso pode funcionar:
Na máquina local:
% echo "pretend this string is a huge amt of data" | scp - remote.com:big.txt
(Isso está usando a convenção - que o scp na verdade não suporta - de substituir um traço pelo arquivo de origem para pedir para ele obter o stdin.)
Respostas:
Você pode canalizar para o ssh e executar um comando remoto. Nesse caso, o comando remoto é o
cat > big.txt
que copiará stdin nobig.txt
arquivo.É fácil e direto, desde que você possa usar o ssh para conectar-se à extremidade remota.
Você também pode usar
nc
(NetCat) para transferir os dados. Na máquina receptora (por exemplo, host.example.com):Isso será configurado
nc
para escutar a porta 1234 e copiar qualquer coisa enviada para essa porta para obig.txt
arquivo. Em seguida, na máquina de envio:Este comando informará
nc
no lado de envio para conectar-se à porta 1234 no receptor e copiar os dados do stdin pela rede.No entanto, a
nc
solução tem algumas desvantagens:ssh
.ssh
solução, você pode iniciar a transferência de apenas um dos pontos de extremidade.fonte
tar -cvzf >(ssh destination 'cat > file') huge_directory_tree
nc
ele, também oferece criptografia e compactação de seus dados por padrão e mais importante: detecção de erros. Tive situações em que useinc
com um driver de rede com defeito e os dados corrompidos foram transmitidos sem serem detectados. O SSH falhará nessa situação, porque não pode descriptografar / descompactar dados defeituosos.Usando ssh:
fonte
Use nc (Net Cat), que não precisa salvar o arquivo localmente.
fonte
nc
para isso. Certa vez, joguei uma imagem de disco bruto de uma máquina para outra, apenas para descobrir muito mais tarde que meu driver de rede estava com defeito e transferi bits com defeito. Usescp
,ssh
ou qualquer outra coisa que lhe dirá quando há um erro de transmissão.Use um tubo FIFO:
fonte
scp
reclamou que o mypipe não era um arquivo normal.mkfifo
para criar o tubo, no entanto.)scp <(ls) destination
Thanx Denis Scherbakov!
Quando tentei seu script na nuvem Hetzner, obtive
Mas apenas um arquivo sem conteúdo foi criado. Como o conteúdo real já está criptografado com o openssl, na verdade não precisamos do scp. O linux embutido
ftp
também possui ótimos recursos de tubulação. Então aqui está a minha solução (ainda bastante manual):fonte
Aqui está uma solução alternativa:
Todos os exemplos acima sugerindo ssh + cat assumem que "cat" está disponível no sistema de destino.
No meu caso, o sistema (backup Hetzner) tinha um conjunto muito restritivo de ferramentas que ofereciam sftp, mas não um shell completo. Portanto, não foi possível usar o ssh + cat. Eu vim com uma solução que usa sinalizador "scp -t" não documentado. O script completo pode ser encontrado abaixo.
Atualização 2019.05.08:
Conforme a solicitação, abaixo está uma versão muito mais simples e mais curta.
fonte
scp -t
? No momento, você possui um script completo altamente personalizado / localizado em seu ambiente. Uma coisa boa para o wiki da Hetzner, mas não para o Superusuário, onde a maioria das pessoas está apenas procurando como canalizar a entrada pelo scp.