¿Es posible especificar un puerto ssh diferente cuando se usa rsync?

366

He estado intentando el siguiente comando:

rsync -rvz --progress --remove-sent-files ./dir user@host:2222/path

SSH se está ejecutando en el puerto 2222, pero rsync todavía intenta usar el puerto 22 y luego se queja de no encontrar la ruta, porque, por supuesto, no existe.

Me gustaría saber si es posible sincronizar a un host remoto en un puerto ssh no estándar.

Ketema
fuente

Respuestas:

136

Otra opción, en el host desde el que ejecuta rsync, configure el puerto en el archivo de configuración ssh, es decir:

cat ~/.ssh/config
Host host
    Port 2222

Entonces rsync sobre ssh hablará con el puerto 2222:

rsync -rvz --progress --remove-sent-files ./dir user@host:/path
Joao Costa
fuente
21
Aunque esta no es la respuesta más obvia, sigue siendo una muy buena respuesta. Vale la pena usar la configuración SSH para cualquier host al que se conecte más de una o dos veces, ya que le ahorrará mucho pensar y escribir.
John Hunt
55
De hecho, aunque para ser justos, la desventaja es que se vuelve invisible, es decir, después de un tiempo uno podría olvidar que está en el archivo de configuración ssh y no entender cómo funciona, o uno de sus colegas podría copiar / pegar el comando y no entender por qué No funciona en su cuenta. Aún así, personalmente prefiero no tener que escribir el número de puerto todo el tiempo.
Joao Costa
1
Esto es horrible es completamente incompatible con el puerto NATing. a menos que desee tener varios nombres de DNS para la misma dirección IP, lo cual es un problema de mantenimiento
vigente el
1
@melfect ¿Estás bromeando? No lo llamaría horrible tanto como lo llamaría lo mejor para alguien que necesita rsyncun puerto extraño muchas veces, pero cada vez se extiende lo suficiente como para olvidar la sintaxis.
Freedom_Ben
1
Si bien esto facilita la conexión, también facilita a los piratas informáticos, y su auth.log volverá a verse inundado de intentos automáticos. Por lo tanto, anula el punto de cambiar los puertos.
forthrin
625

Su línea de comando debería verse así:

rsync -rvz -e 'ssh -p 2222' --progress ./dir user@host:/path

esto funciona bien, lo uso todo el tiempo sin necesidad de nuevas reglas de firewall, solo tenga en cuenta que el comando SSH está entre comillas.

klapa
fuente
8
Me pregunto por qué es así: es una necesidad tan obvia, todavía bastante oculta, ya que esto está creando efectivamente un alias para el binario ssh. (Sin embargo, funcionó sin problemas)
jsbueno
1
Funciona con el símbolo de dos puntosuser@host:/path
DmitrySandalov
23
la parte clave del comando es -e 'ssh -p 2222' para que pueda usar esto con diferentes parámetros rsync
Evan Donovan
2
Tenga en cuenta que si necesita especificar una clave ssh, puede hacerlo como -e 'ssh -i mykey -p 2222'
dranxo
99
¿por qué --remove-sent-files? Si es peligroso para los datos de origen, mejor menciónalo ...
Tiw
14

cuando necesite enviar archivos a través de un puerto SSH específico:

rsync -azP -e "ssh -p PORT_NUMBER" source destination

ejemplo

rsync -azP -e "ssh -p 2121" /path/to/files/source user@remoteip:/path/to/files/destination
Techie
fuente
3
¿Y qué agrega esto exactamente a la respuesta existente?
Chris Maes
mira el formato yy el ejemplo. He simplificado las cosas aquí.
Techie
44
OK, eliminó dos opciones opcionales, pero en esencia su respuesta es exactamente la misma que la aceptada ...
Chris Maes
2
Es más simplificado y formateado. Más fácil de entender para los nuevos alumnos. Por cierto, gracias por el voto negativo sin razón
Techie
2

Un poco fuera de tema pero podría ayudar a alguien. Si necesita pasar la contraseña y el puerto, sugiero usar el sshpasspaquete. El comando de línea de comando se vería así: sshpass -p "password" rsync -avzh -e 'ssh -p PORT312' [email protected]:/dir_on_host/

Tomás
fuente
Esto no funciona porque el teclado interactivo se mete con el flujo de datos, corrompiendo el protocolo.
Evi1M4chine
2

Encontré esta solución en el sitio de Mike Hike Hostetler que funcionó perfectamente para mí.

# rsync -avz -e "ssh -p $portNumber" user@remoteip:/path/to/files/ /local/path/
Oxidado1
fuente
3
¿Y qué agrega esto exactamente a la respuesta existente?
Chris Maes
Nice one funciona perfectamente. Gracias :)
Sammu Sundar
2

La sintaxis correcta es decirle a Rsync que use un comando SSH personalizado (agregando -p 2222), que crea un túnel seguro al lado remoto usando SSH, luego se conecta a través de localhost: 873

rsync -rvz --progress --remove-sent-files -e "ssh -p 2222" ./dir usuario @ host / ruta

Rsync se ejecuta como un daemon en el puerto TCP 873, que no es seguro.

Del hombre Rsync:

Push: rsync [OPCIÓN ...] SRC ... [USUARIO @] HOST: DEST

Lo que induce a error a la gente a intentar esto:

rsync -rvz --progress --remove-sent-files ./dir usuario @ host: 2222 / ruta

Sin embargo, eso le indica que se conecte al demonio Rsync en el puerto 2222, que no está allí.

kevinf
fuente
otras respuestas no mencionaron el puerto 873
kevinf
la pregunta era cómo hacer que se ejecute como ssh sobre el puerto 2222; si rsync lo requiere o no, es una historia diferente.
Dan Steingart el
@DanSteingart He actualizado la respuesta, ¿ayuda más ahora?
kevinf
-3

No pude lograr que rsync se conectara a través de ssh en un puerto diferente, pero pude redirigir la conexión ssh a la computadora que quería a través de iptables. Esta no es la solución que estaba buscando, pero resolvió mi problema.

Ketema
fuente