¿Puedo canalizar stdout en un servidor a stdin en otro servidor?

74

stdouten un servidor CentOS debe conectarse a stdinotro servidor CentOS. es posible?

Actualizar

ScottPack, MikeyB y jofel tienen respuestas válidas. Le di la respuesta a Scott porque, aunque mi pregunta no especificaba la seguridad como un requisito, siempre es bueno estar seguro. Sin embargo, las sugerencias de los otros dos compañeros también funcionarán.

Wesley
fuente
1
Vale la pena señalar que la (única) ventaja principal del enfoque no ssh es la velocidad de rendimiento; Si está en una red rápida y la seguridad es innecesaria, puede valer la molestia adicional de escribir dos comandos en dos ventanas.
Random832

Respuestas:

94

Este es un sí descarado.

Cuando uno usa sshpara ejecutar un comando en un servidor remoto, realiza algún tipo de redireccionamiento interno de entrada / salida sofisticado. De hecho, creo que esta es una de las características más sutiles de OpenSSH. En concreto, si se utiliza sshpara ejecutar un comando arbitrario en un sistema remoto, a continuación, ssh mapa STDINy STDOUTa la del comando que se está ejecutando.

A modo de ejemplo, supongamos que desea crear un tarball de respaldo, pero no quiere o no puede almacenarlo localmente. Echemos un vistazo a esta sintaxis:

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

Estamos creando un tarball y escribiéndolo en STDOUTcosas normales. Como estamos usando ssh para ejecutar un comando remoto, STDIN se asigna al STDINde cat. Que luego redirigimos a un archivo.

Scott Pack
fuente
11
Eso no es ningún tipo de "redirección interna de entrada / salida sofisticada", solo las cosas simples y aburridas. ssh lee desde STDIN, como cualquier otra herramienta, y lo pasa al proceso remoto. :)
Daniel Pittman
77
@DanielPittman: Pero es mucho más divertido llamarlo basura "elegante interna".
Scott Pack
77
Del mismo modo, netcaten ambos extremos se convierte en un gran canal de comunicación simple y fácil. tar cf - /path/to/dir | nc 1.2.3.4 5000en un servidor, nc -l -p 5000 > backupfile.taren el otro.
MikeyB
1
@MikeyB: Buen punto. Netcat es un protocolo de texto claro, así que tenga cuidado con los datos confidenciales. Tiendo a usar netcat para cosas más específicas como adquisiciones de unidades de red (ala dd) en una red local y escaneo de puertos.
Scott Pack
2
@MikeyB: ¡Ustedes, qué pasa con sus asientos voladores y sus pantalones!
Scott Pack
28

Una forma conveniente de canalizar datos entre hosts cuando no necesita preocuparse por la seguridad a través del cable es usar netcatambos extremos de la conexión.

Esto también le permite configurarlos de forma asíncrona:

En el "receptor" (realmente, tendrá comunicación bidireccional, pero es más fácil pensarlo así), ejecute:

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

Y en el "remitente", ejecute:

tar cf - /path/to/dir | nc 1.2.3.4 5000
MikeyB
fuente
Muy bueno saberlo. Esto es bueno si la conexión física es confiable, tal vez como una red de respaldo o si la conexión ya está en túnel.
Wesley
O si los datos son públicos de todos modos.
Samuel Edwin Ward
1
+1 netcat es una herramienta invaluable, especialmente cuando no tienes un servidor ssh ejecutándose.
kwarrick
21

Una herramienta muy poderosa para crear conexiones unidireccionales y bidireccionales es socat. Para un breve vistazo a las posibilidades, vea los ejemplos en su página de manual .

Reemplaza netcaty herramientas similares por completo y tiene soporte para conexiones cifradas SSL. Para los principiantes, puede que no sea lo suficientemente simple, pero al menos es bueno saber que existe.

jofel
fuente
1
@WesleyDavid: Para su "Actualización": para completar, agregué a mi respuesta que socat tiene soporte SSL, por lo que el cifrado también es posible con socat. Sin embargo, ssh es en la mayoría de los casos la solución mejor y más fácil, por lo que también habría elegido la respuesta de ScottPack.
jofel
5

TL; DR

Las cosas solo se vuelven un poco más complicadas cuando tienes un servidor bastión que debe usarse.

  1. Puede pasar sshcomo el comando que sshdesee:

    • 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 con los pseudo terminales


Tenga en cuenta que el punto de importancia clave aquí es que ssh, como la mayoría de las herramientas, solo trata stdouty stdincorrige por defecto.

Sin embargo, cuando comience a ver la opción Me gusta Disable pseudo-terminal allocation.y Force pseudo-terminal allocation.es posible que deba hacer un poco de prueba y error. Pero, como regla general , no desea alterar el ttycomportamiento a menos que esté tratando de arreglar basura ilegible / binaria en un emulador de terminal (lo que un humano escribe).

Por ejemplo, tiendo a usarlo -Atpara que el agente ssh de mi estación de trabajo se reenvíe, y para que ejecutar tmux de forma remota no interrumpa el binario (así ssh -At bastion.internal tmux -L bruno attach). Y, para Docker también (como así sudo docker exec -it jenkins bash).

Sin embargo, esas dos -tbanderas causan algunos daños en los datos difíciles de rastrear cuando intento hacer algo como esto:

# 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.
Bruno Bronosky
fuente
2

Intente poner su clave pública ssh en otro host con solo un comando

ssh [email protected] 'cat >> .ssh/authorized_keys' < .ssh/id_rsa.pub
pylover
fuente
2

Creo que esto es lo más fácil, después de configurar el protocolo de enlace sin contraseña entre servidores para el usuario que está ejecutando el comando como:

Sin comprimir

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

Compresión sobre la marcha

tar czf - . | ssh servername "cd /path-to-dir && tar xzf -"
usuario60802
fuente
Usar compresión en el archivo tar es una muy mala idea si sshya está configurado para la compresión.
Anthon
@Anthon ¿Por qué es tan malo y cómo se comprobaría si la compresión ssh ya está habilitada?
Tom Hale
1
@TomHale Dependiendo de la velocidad de su sistema, esto podría ralentizar el funcionamiento general, ya que la segunda compresión lleva tiempo, pero es poco probable que afeite bytes adicionales. Compressionpodría establecerse en cualquiera de los archivos de configuración, una comprobación rápida es para ver si ssh -v localhost exit 2>&1 | fgrep -i compressda algún resultado (AFAIK no hay opción para volcar la configuración ya que ssh la ha leído).
Anthon
tartiene una -C pathbandera que funciona para los comandos cy x. No tiene que poner un cdcomando separado allí. (Pero es bueno tener en cuenta que puede ejecutar más de un comando.)
Bruno Bronosky
@Bruno, -Ces una extensión de GNU (aunque ahora también es compatible con bsdtar y schily tar)
Stéphane Chazelas