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
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 usandorsync
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)
~/.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.ssh
en uno para los hosts remotos y emitir unscp
simple desde allí, o hacerlo en una línea con algo comossh -t -p <remote1 port> user1@remote1 'scp -P <remote2 port> user2@remote2:/source/path /dest/path'
. Además, ganó ' no tendrá que editarconfig
archivos en cualquier momento: solo una vez para cada par de hosts (por ejemplo, configurar el puerto para conectándose aremote2
enremote1
), pero, por supuesto, es posible que se sienta incómodo con esto, dependiendo de la cantidad de hosts que tenga.