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

69

stdout em um servidor CentOS precisa ser canalizado para stdin em outro servidor CentOS. Isso é possível?

Atualizar

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

    
por Wesley 15.03.2012 / 21:04

6 respostas

90

Este é um sim descarado.

Quando se usa ssh para executar um comando em um servidor remoto, ele realiza algum tipo de redirecionamento interno de entrada / saída. Na verdade, acho que esse é um dos recursos mais sutis do OpenSSH. Especificamente, se você usar ssh para executar um comando arbitrário em um sistema remoto, o ssh mapeará STDIN e STDOUT para o comando que está sendo executado.

Para fins de exemplo, vamos supor que você queira criar um tarball de backup, mas não quer ou não pode 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 o escrevendo para STDOUT , coisas normais. Como estamos usando o ssh para executar um comando remoto, o STDIN é mapeado para STDIN of cat . Que nós então redirecionamos para um arquivo.

    
por 15.03.2012 / 21:05
24

Uma maneira conveniente de enviar dados entre hosts quando você não precisa se preocupar com a segurança está usando netcat em ambas as extremidades da conexão.

Isso também permite configurá-los de forma assíncrona:

No "receptor" (na verdade, você terá 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
    
por 15.03.2012 / 22:31
20

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 .

Substitui netcat e ferramentas semelhantes completamente e tem suporte para conexões SSL criptografadas. Para iniciantes, pode não ser simples o suficiente, mas é bom saber que existe.

    
por 15.03.2012 / 23:46
5

TL; DR

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

  1. Você pode passar ssh como o comando para ssh da seguinte forma:

    • 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 os pseudo-terminais

Observe que o ponto de importância fundamental aqui é que ssh , como a maioria das ferramentas, apenas trata stdout e stdin como padrão.

No entanto, quando você começa a ver opções como Disable pseudo-terminal allocation. e Force pseudo-terminal allocation. , pode ser necessário fazer um pouco de tentativa e erro. Mas, como uma regra geral , você não quer alterar o tty a menos que você esteja tentando consertar lixo eletrônico / binário em um emulador de terminal (o que um ser humano digita).

Por exemplo, tenho a tendência de usar -At para que o ssh-agent da minha estação de trabalho seja encaminhado e para que a execução do tmux remotamente não torne o binário (assim como ssh -At bastion.internal tmux -L bruno attach ). E, para o docker também (assim como sudo docker exec -it jenkins bash ).

No entanto, esses dois -t sinalizadores dificultam o rastreamento de dados corrompidos 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.
    
por 21.02.2017 / 17:18
2

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

ssh [email protected] 'cat >> .ssh/authorized_keys' < .ssh/id_rsa.pub
    
por 28.01.2015 / 20:21
2

Eu acho isso o mais fácil, depois de configurar nenhum handshaking de senha entre os servidores para o usuário no qual você está executando o comando:

Descompactado

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 -"
    
por 19.02.2014 / 17:44