¿Cómo especificar el puerto para scp para un servidor remoto?

Tengo dos nodos remotos que intento enviar archivos de uno a otro.

scp remote1:~/testSCP [email protected]:~/ 

Tengo ~/ssh/config configurado en mi máquina local, así que está usando el puerto 2222 por defecto.

Pero el puerto ssh predeterminado del control remoto1 está configurado en 22 en la configuración ssh en lugar del puerto 2222. Entonces, para hacer cualquier conexión externa a través de ssh, usa el puerto 22 por defecto.

Intenté lo siguiente que no funcionó:

scp -P 2222 remote1:~/testSCP [email protected]:~/ 

También probé lo siguiente, que tampoco funcionó:

scp remote1:~/testSCP -P 2222 [email protected]:~/ 

Para ambos obtuve el siguiente error:

ssh: connect to host 10.0.1.10 port 22: Connection refused lost connection 

Lo cual es cierto ya que 10.0.1.10 está usando el puerto 2222 y no el puerto 22.

¿Cómo puedo especificar que remote1 use el puerto 2222 al intentar enviar archivos a (remote2) de remote1?

Actualizar

Después de intentar

 scp -3 remote1:~/testSCP [email protected]:~/ 

Tengo un comportamiento extraño. Aunque mi contraseña es correcta, me da el siguiente resultado:

[email protected]"s password: [email protected]"s password: Permission denied, please try again. [email protected]"s password: Permission denied, please try again. [email protected]"s password: 

Todavía no he habilitado la autenticación sin clave.

Nueva actualización

Después de intentarlo de varias formas, pude hacerlo en mis scripts iniciando sesión en remote1 a través de ssh desde mi localhost y luego scp desde remote1 a remote2. Sin embargo, esto no responde a mi pregunta. Tenía la intención de hacerlo directamente desde mi máquina local y luego transferir archivos entre dos instancias, lo que creo que no es compatible si dos demonios ssh de dos instancias están usando un puerto diferente al predeterminado para la conexión ssh.

Comentarios

  • stackoverflow.com/questions/10341032/… podría ayudarlo
  • Probé los que mencioné en mi pregunta. No parecía funcionar para mí
  • localhost escuchando el puerto 22 pero en la configuración ssh está especificado tanto para remote1 como para remote2 al puerto 2222. Sí, me refiero a ~/.ssh/config En remoto 1 y remoto, el puerto predeterminado en ~ / .ssh / config no ha cambiado, por lo que su puerto predeterminado 22. Puedo editarlos, pero me gustaría hacerlo usando una sola línea, en lugar de editar cada configuración de ssh cada vez.
  • De acuerdo. Yo ' sugeriría editar su pregunta, agregando que puede, pero no está ' t dispuesto a hacerlo, edite su archivos. Luego, puede ssh en uno para los hosts remotos y emitir un scp simple desde allí, o hacerlo en una línea con algo como ssh -t -p <remote1 port> user1@remote1 'scp -P <remote2 port> user2@remote2:/source/path /dest/path'. Además, ganó ' no tendrá que editar config archivos en cualquier momento: solo una vez para cada par de hosts (por ejemplo, configurar el puerto para conectándose a remote2 en remote1), pero, por supuesto, es posible que se sienta incómodo con esto, dependiendo de la cantidad de hosts que tenga.
  • Sí, eso responde a su pregunta. " No " es una respuesta y es la respuesta, sin importar si te guste o no.

Responder

No puedes hacer eso con un simple scp de remoto a remoto [1].

En lugar de hacerlo, ssh al primer host remoto y ejecute scp con un argumento de puerto desde allí:

ssh -p 2222 ruser1@rhost1 scp -P 2222 /rpath/1 ruser2@rhost2:/rpath/2 

Si desea hacer exactamente lo que scp está haciendo, también puede agregar las opciones -n -x -oClearAllForwardings=yes a ssh, aunque normalmente no es necesario.


[1]: las versiones más recientes de scp admiten una especificación de uri (incluido un puerto) en lugar de host:path, pero solo cuando se usa la opción -3 («pasar a través del host local»).

Así que probablemente podría usar

scp -3 -P 2222 ruser1@rhost1:/rpath/1 scp://ruser2@rhost2:2222//rpath/2 

(observe que / después de host[:port] no es parte de la ruta – se referirá a ./file en el directorio de inicio de user«).

Pero copiar a través del localhost es más lento y, en mi experiencia, ocultará errores. Por ejemplo, esto no imprimirá ningún mensaje de error, a pesar de no poder crear ningún /foo/bar/baz archivo:

scp -3 localhost:.bashrc localhost:/foo/bar/baz 

No profundicé en esto, simplemente lo evité 😉


Si alguien no está convencido de todo esto, puede mirar el código fuente :

void toremote(char *targ, int argc, char **argv) { ... } else if (host) { /* standard remote to remote */ if (tport != -1 && tport != SSH_DEFAULT_PORT) { /* This would require the remote support URIs */ fatal("target port not supported with two " "remote hosts without the -3 option"); } 

Observe que la variable tport solo está configurada analizando un scp:// uri, y simplemente no existe en versiones anteriores a 7.6p1 (octubre de 2017).

Comentarios

  • ¿Podría explicar qué -x -oClearAllForwardings=yes está haciendo esta opción en su respuesta, por favor? También estaba pensando si se puede hacer usando rsync en su lugar.
  • -x deshabilita el reenvío X11 y -oClear.. deshabilita todos los reenvíos de tcp (en caso de que alguno de ellos fuera forzado a través de ~/.ssh/config o /etc/ssh/ssh_config)
  • @RakibFiha rsync dice: " El origen y el destino no pueden ser remotos ". Tal vez haya trucos al respecto, pero esa debería ser una pregunta aparte.
  • Ahora, me doy cuenta después de su explicación detallada. (y)

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *