Posso canalizar stdout em um servidor para stdin em outro servidor?


74

stdoutem um servidor CentOS precisa ser canalizado para stdinoutro servidor CentOS. Isso é possível?

Atualizar

ScottPack, MikeyB e jofel têm respostas válidas. Concordei com a resposta de Scott porque, embora minha pergunta não especificasse a segurança como um requisito, é sempre bom estar seguro. No entanto, as sugestões dos outros dois companheiros também funcionarão.


11
Vale a pena notar que a (única) grande vantagem da abordagem não-ssh é a velocidade da taxa de transferência; se você estiver em uma rede rápida e a segurança for desnecessária, pode valer a pena o inconveniente extra de digitar dois comandos em duas janelas.
Random832

Respostas:


94

Este é um sim descarado.

Quando se utiliza sshum comando em um servidor remoto, ele executa algum tipo de redirecionamento interno de entrada / saída. Na verdade, acho que esse é um dos recursos sutilmente mais agradáveis ​​do OpenSSH. Especificamente, se você usar sshpara executar um comando arbitrário em um sistema remoto, o ssh será mapeado STDINe STDOUTpara o comando que está sendo executado.

Para fins de exemplo, vamos supor que você deseja criar um tarball de backup, mas não deseja armazená-lo localmente. Vamos dar uma olhada nessa sintaxe:

$ tar -cf - /path/to/backup/dir | ssh remotehost "cat - > backupfile.tar"

Estamos criando um tarball e escrevendo-o para STDOUTcoisas normais. Como estamos usando o ssh para executar um comando remoto, o STDIN é mapeado para o STDINde cat. Que então redirecionamos para um arquivo.


11
Isso não é nenhum tipo de "redirecionamento interno sofisticado de entrada / saída" - apenas as coisas comuns comuns e chatas. O ssh lê do STDIN, como qualquer outra ferramenta, e passa para o processo remoto. :)
Daniel Pittman

7
@DanielPittman: Mas é muito mais divertido chamá-lo de lixo "sofisticado interno".
Scott pacote de

7
Da mesma forma, netcatnas duas extremidades, é um ótimo canal de comunicação simples e fácil. tar cf - /path/to/dir | nc 1.2.3.4 5000em um servidor, nc -l -p 5000 > backupfile.tarpor outro.
MikeyB

11
@ MikeyB: Bom ponto. O Netcat é um protocolo de texto não criptografado, portanto, tenha cuidado com dados confidenciais. Eu costumo usar o netcat para coisas mais específicas, como aquisições de unidades de rede (ala dd) em uma rede local e em varredura de portas.
Scott pacote de

2
@MikeyB: Vocês sabem o que com seus assentos voadores e suas calças!
Scott pacote de

28

Uma maneira conveniente de canalizar dados entre hosts, quando você não precisa se preocupar com a segurança por cabo, está usando netcatnas duas extremidades da conexão.

Isso também permite que você os configure de forma assíncrona:

No "receptor" (realmente, você terá uma comunicação bidirecional, mas é mais fácil pensar assim), execute:

nc -l -p 5000 > /path/to/backupfile.tar

E no "remetente", execute:

tar cf - /path/to/dir | nc 1.2.3.4 5000

Muito bom saber. Isso é bom se a conexão física for confiável, como talvez uma rede de backup ou se a conexão já estiver encapsulada.
23412 Wesley

Ou se os dados forem públicos de qualquer maneira.
Samuel Edwin Ward

11
O +1 netcat é uma ferramenta inestimável, especialmente quando você não possui um servidor ssh em execução.
kwarrick

21

Uma ferramenta muito poderosa para criar conexões uni e bidirecionais é socat. Para uma breve olhada nas possibilidades, veja os exemplos em sua página de manual .

Ele substitui netcatcompletamente as ferramentas similares e oferece suporte para conexões criptografadas ssl. Para iniciantes, pode não ser simples o suficiente, mas é pelo menos bom saber que existe.


11
@WesleyDavid: Para a sua "Atualização": apenas para completar, eu adicionei à minha resposta que o socat tem suporte a SSL, então a criptografia também é possível com o socat. No entanto, o ssh é, na maioria dos casos, a solução melhor e mais fácil, então eu também teria escolhido a resposta do ScottPack.
Jofel

5

TL; DR

As coisas só ficam um pouco mais complicadas quando você tem um servidor bastião que deve ser usado.

  1. Você pode passar sshcomo o comando da seguinte sshmaneira:

    • cat local_script.sh | ssh -A usera@bastion ssh -A userb@privateserver "cat > remote_copy_of_local_script.sh; bash remote_copy_of_local_script.sh"
  2. Cuidado com pseudo-terminais


Observe que o ponto de maior importância aqui é que ssh, como a maioria das ferramentas, trata stdoute stdincorrige por padrão.

No entanto, quando você começa a ver a opção como Disable pseudo-terminal allocation.e Force pseudo-terminal allocation.pode ser necessário fazer uma pequena tentativa e erro. Mas, como regra geral, você não deseja alterar o ttycomportamento, a menos que esteja tentando corrigir lixo ilegível / binário em um emulador de terminal (o que um humano digita).

Por exemplo, eu costumo usar -Atpara que o agente ssh da minha estação de trabalho seja encaminhado e para que a execução remota do tmux não seja binária (assim ssh -At bastion.internal tmux -L bruno attach). E, para docker também (assim sudo docker exec -it jenkins bash).

No entanto, esses dois -tsinalizadores causam dificuldades para rastrear a corrupção de dados quando tento fazer algo assim:

# copy /etc/init from jenkins to /tmp/init in testjenkins running as a container
ssh -A bastion.internal \
ssh -A jenkins.internal \
sudo tar cf - -C /etc init | \
sudo docker exec -i testjenkins \
bash -c 'tar xvf - -C /tmp'

# note trailing slashes to make this oneliner more readable.

2

Tente colocar sua chave pública ssh em outro host apenas com um comando

ssh root@example.com 'cat >> .ssh/authorized_keys' < .ssh/id_rsa.pub

2

Acho que é o mais fácil, depois de configurar nenhum handshake de senha entre servidores para o usuário, você está executando o comando como:

Descomprimido

tar cf - . | ssh servername "cd /path-to-dir && tar xf -"

Compressão em tempo real

tar czf - . | ssh servername "cd /path-to-dir && tar xzf -"

Usar a compactação no arquivo tar é uma péssima idéia se você sshjá estiver configurado para compactação.
Anthon

@ Anthon Por que tão ruim, e como verificar se a compressão ssh já está ativada?
Tom Hale

11
@TomHale Dependendo da velocidade do sistema, isso pode desacelerar a operação geral, pois a segunda compactação leva tempo, mas é improvável que você depile bytes adicionais. Compressionpode ser definido em qualquer um dos arquivos de configuração, uma verificação rápida para verificar se há ssh -v localhost exit 2>&1 | fgrep -i compressalguma saída (AFAIK não há opção para despejar a configuração conforme o ssh a leu).
Anthon

tarpossui um -C pathsinalizador que funciona para os comandos ce x. Você não precisa colocar um cdcomando separado lá. (Mas é bom notar que você pode executar mais de um único comando.)
de Bruno Bronosky

@Bruno, -Cé uma extensão GNU (embora agora também suportada por bsdtar e alcatrão Schilly)
Stéphane Chazelas
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.