transferir transferencia subir servidor remoto por desde descargar copiar consola comando archivos ssh

transferencia - transferir archivos de windows a linux ssh



¿Cuál es la mejor manera de llevar un archivo desde un host remoto al host local a través de una sesión SSH? (10)

Aquí está mi solución preferida para este problema. Configure un túnel ssh inverso al crear la sesión ssh. Esto se facilita con dos funciones bash: grabfrom () debe definirse en el host local, mientras que grab () debe definirse en el host remoto. Puede agregar cualquier otra variable ssh que use (por ejemplo, -X o -Y) como mejor le parezca.

function grabfrom() { ssh -R 2202:127.0.0.1:22 ${@}; }; function grab() { scp -P 2202 $@ [email protected]:~; };

Uso:

localhost% grabfrom remoteuser@remotehost password: <remote password goes here> remotehost% grab somefile1 somefile2 *.txt password: <local password goes here>

Positivos:

  • Funciona sin software especial en cualquier host más allá de OpenSSH
  • Funciona cuando el host local está detrás de un enrutador NAT
  • Se puede implementar como un par de dos funciones bash de una sola línea

Negativos:

  • Utiliza un número de puerto fijo por lo que:
    • no funcionará con múltiples conexiones al host remoto
    • podría entrar en conflicto con un proceso que utiliza ese puerto en el host remoto
  • Requiere localhost accept ssh connections
  • Requiere un comando especial en la iniciación de la sesión
  • No maneja implícitamente la autenticación al host local
  • No permite especificar el directorio de destino en el host local
  • Si toma de múltiples locales al mismo host remoto, a ssh no le gustará que cambien las teclas

Trabajo futuro: esto todavía es bastante kludgy. Obviamente, sería posible manejar el problema de autenticación configurando las claves ssh de manera apropiada y es aún más fácil permitir la especificación de un directorio remoto agregando un parámetro a grab ()

Más difícil es abordar los otros aspectos negativos. Sería bueno elegir un puerto dinámico pero, por lo que puedo ver, no hay una forma elegante de pasar ese puerto al shell en el host remoto; Lo mejor que puedo decir es que OpenSSH no le permite establecer variables de entorno arbitrarias en el host remoto y bash no puede tomar variables de entorno de un argumento de línea de comando. Incluso si pudiera elegir un puerto dinámico, no hay forma de asegurarse de que no se use en el host remoto sin conectarse primero.

Cuando me conecto a hosts remotos a través de ssh, con frecuencia quiero traer un archivo en ese sistema al sistema local para verlo o procesarlo. ¿Hay alguna forma de copiar el archivo sin (a) abrir un nuevo terminal / pausar la sesión ssh (b) autenticando nuevamente a los hosts locales o remotos que funciona (c) incluso cuando uno o ambos hosts están detrás de un Enrutador NAT?

El objetivo es aprovechar la mayor parte del estado actual posible: que hay una conexión entre las dos máquinas, que estoy autenticado en ambos, que estoy en el directorio de trabajo del archivo, así que no tiene que abrir otra terminal y copiar y pegar el host remoto y la ruta de acceso, que es lo que hago ahora. La mejor solución tampoco requeriría ninguna configuración antes de que comenzara la sesión, pero si la configuración era de una sola vez o podía automatizarse, entonces eso es perfectamente aceptable.


Aquí hay un truco llamado ssh-xfer que aborda el problema exacto, pero requiere parchear OpenSSH, que es un non-starter en lo que a mí respecta.


Debería poder configurar claves públicas y privadas para que no se necesite autenticación.

La forma en que lo haga depende de los requisitos de seguridad, etc. (tenga en cuenta que hay linux / unix ssh worms que verán las claves para encontrar otros hosts que puedan atacar).

Lo hago todo el tiempo desde detrás de los enrutadores linksys y dlink. Creo que es posible que deba cambiar algunas configuraciones, pero no es gran cosa.


El uso de ControlMaster (el interruptor -M) es la mejor solución, mucho más simple y fácil que el resto de las respuestas aquí. Le permite compartir una única conexión entre varias sesiones. Parece que hace lo que el afiche quiere. Sin embargo, todavía tiene que escribir la línea de comando scp o sftp. Intentalo. Lo uso para todos mis sshing.


En un linux box utilizo ssh-agent y sshfs. Necesita configurar el sshd para aceptar conexiones con pares de claves. Luego usa ssh-add para agregar su clave al ssh-agent para que no tenga que escribir su contraseña cada vez. Asegúrese de utilizar -t segundos, para que la clave no permanezca cargada para siempre.
ssh-add -t 3600 /home/user/.ssh/ssh_dsa

Después de esto,
Nombre de host sshfs: / / PathToMountTo /
montará el sistema de archivos del servidor en su máquina para que tenga acceso a él.

Personalmente, escribí un pequeño script bash que agregaba mi clave y montaba los servidores que más uso, así que cuando empiezo a trabajar solo tengo que iniciar el script y escribir mi contraseña.


Para hacer esto, configuré el enrutador de mi casa para reenviar el puerto 22 a mi máquina doméstica (que está cortafuegos para que solo acepte conexiones SSH desde mi máquina de trabajo) y también tengo una cuenta configurada con DynDNS para proporcionar DNS dinámico que se resolverá automáticamente en mi IP de origen.

Luego, cuando entro en mi computadora de trabajo, lo primero que hago es ejecutar un script que inicie un ssh-agent (si su servidor no lo hace automáticamente). El script que ejecuto es:

#!/bin/bash ssh-agent sh -c ''ssh-add < /dev/null && bash''

Pide mi contraseña clave ssh para que no tenga que escribirla en todo momento. No necesita ese paso si usa una clave ssh sin una frase de contraseña.

Para el resto de la sesión, enviar archivos a su máquina doméstica es tan simple como

scp file_to_send.txt your.domain.name:~/



Usando algunas características poco conocidas y raramente utilizadas de la implementación de openssh, ¡puede lograr exactamente lo que desea!

  • aprovecha el estado actual
  • puede usar el directorio de trabajo donde está
  • no requiere ninguna configuración de tunelización antes de que comience la sesión
  • no requiere abrir una terminal o conexión separada
  • se puede usar como una oferta única en una sesión interactiva o se puede usar como parte de una sesión automatizada

Solo debe escribir lo que está en cada una de las instrucciones local> , remote> y ssh> en los ejemplos a continuación.

local> ssh username@remote remote> ~C ssh> -L6666:localhost:6666 remote> nc -l 6666 < /etc/passwd remote> ~^Z [suspend ssh] [1]+ Stopped ssh username@remote local> (sleep 1; nc localhost 6666 > /tmp/file) & fg [2] 17357 ssh username@remote remote> exit [2]- Done ( sleep 1; nc localhost 6666 > /tmp/file ) local> cat /tmp/file root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin ...

O, más a menudo, desea ir en la otra dirección, por ejemplo, si desea hacer algo como transferir su archivo ~/.ssh/id_rsa.pub desde su máquina local al archivo ~/.ssh/authorized_keys de la máquina remota.

local> ssh username@remote remote> ~C ssh> -R5555:localhost:5555 remote> ~^Z [suspend ssh] [1]+ Stopped ssh username@remote local> nc -l 5555 < ~/.ssh/id_rsa.pub & [2] 26607 local> fg ssh username@remote remote> nc localhost 5555 >> ~/.ssh/authorized_keys remote> cat ~/.ssh/authorized_keys ssh-rsa AAAAB3NzaC1yc2ZQQQQBIwAAAQEAsgaVp8mnWVvpGKhfgwHTuOObyfYSe8iFvksH6BGWfMgy8poM2+5sTL6FHI7k0MXmfd7p4rzOL2R4q9yjG+Hl2PShjkjAVb32Ss5ZZ3BxHpk30+0HackAHVqPEJERvZvqC3W2s4aKU7ae4WaG1OqZHI1dGiJPJ1IgFF5bWbQl8CP9kZNAHg0NJZUCnJ73udZRYEWm5MEdTIz0+Q5tClzxvXtV4lZBo36Jo4vijKVEJ06MZu+e2WnCOqsfdayY7laiT0t/UsulLNJ1wT+Euejl+3Vft7N1/nWptJn3c4y83c4oHIrsLDTIiVvPjAj5JTkyH1EA2pIOxsKOjmg2Maz7Pw== username@local

Un poco de explicación está en orden.

El primer paso es abrir un LocalForward ; si todavía no tiene una establecida, puede usar el carácter de escape ~C para abrir una línea de comando ssh que le dará los siguientes comandos:

remote> ~C ssh> help Commands: -L[bind_address:]port:host:hostport Request local forward -R[bind_address:]port:host:hostport Request remote forward -D[bind_address:]port Request dynamic forward -KR[bind_address:]port Cancel remote forward

En este ejemplo establezco un LocalForward en el puerto 6666 de localhost tanto para el cliente como para el servidor; el número de puerto puede ser cualquier puerto abierto arbitrario.

El comando nc es del paquete netcat ; se describe como la "navaja suiza TCP / IP"; es un programa simple, pero muy flexible y útil. Conviértalo en una parte estándar de su cinturón de herramientas de Unix.

En este punto, nc está escuchando en el puerto 6666 y esperando que otro programa se conecte a ese puerto para que pueda enviar el contenido de /etc/passwd .

Luego hacemos uso de otro carácter de escape ~^Z que es tilde seguido por control-Z . Esto suspende temporalmente el proceso ssh y nos devuelve a nuestro caparazón.

Una vez en el sistema local puede usar nc para conectarse al puerto reenviado 6666. Observe la falta de un -l en este caso porque esa opción le dice a nc que escuche en un puerto como si fuera un servidor que no es lo que queremos ; en su lugar, queremos simplemente usar nc como cliente para conectarnos a la nc ya está escuchando en el lado remoto.

El resto de la magia alrededor del comando nc es necesaria porque si recuerdas más arriba, dije que el proceso ssh se suspendió temporalmente, por lo que & va a poner la expresión completa (sleep + nc) en segundo plano y el sleep te dará tiempo suficiente para ssh para volver al primer plano con fg .

En el segundo ejemplo, la idea es básicamente la misma, excepto que configuramos un túnel en la otra dirección usando -R lugar de -L para que establezcamos un RemoteForward . Y luego en el lado local es donde desea usar el argumento -l para nc .

El carácter de escape por defecto es ~ pero puede cambiar eso con:

-e escape_char Sets the escape character for sessions with a pty (default: ‘~’). The escape character is only recognized at the beginning of a line. The escape character followed by a dot (‘.’) closes the connection; followed by control-Z suspends the connection; and followed by itself sends the escape character once. Setting the character to “none” disables any escapes and makes the session fully transparent.

Una explicación completa de los comandos disponibles con los caracteres de escape está disponible en la página de manual de ssh

ESCAPE CHARACTERS When a pseudo-terminal has been requested, ssh supports a number of functions through the use of an escape character. A single tilde character can be sent as ~~ or by following the tilde by a character other than those described below. The escape character must always follow a newline to be interpreted as special. The escape character can be changed in configuration files using the EscapeChar configuration directive or on the command line by the -e option. The supported escapes (assuming the default ‘~’) are: ~. Disconnect. ~^Z Background ssh. ~# List forwarded connections. ~& Background ssh at logout when waiting for forwarded connection / X11 sessions to terminate. ~? Display a list of escape characters. ~B Send a BREAK to the remote system (only useful for SSH protocol version 2 and if the peer supports it). ~C Open command line. Currently this allows the addition of port forwardings using the -L, -R and -D options (see above). It also allows the cancellation of existing remote port- forwardings using -KR[bind_address:]port. !command allows the user to execute a local command if the PermitLocalCommand option is enabled in ssh_config(5). Basic help is avail‐ able, using the -h option. ~R Request rekeying of the connection (only useful for SSH protocol version 2 and if the peer supports it).


Use el interruptor -M.

"Pone al cliente ssh en modo ''maestro'' para la fusión de conexiones. Las opciones Múltiples -M ponen ssh en el modo` `maestro '''' y se requiere confirmación antes de que se acepten conexiones esclavas. Consulte la descripción de ControlMaster en ssh_config (5) para detalles ".

No veo muy bien cómo responde eso la pregunta del OP: ¿puede ampliar esto un poco, David?


zssh (un contenedor ZMODEM sobre openssh) hace exactamente lo que quieres.

  • Instala zssh y úsalo en lugar de openssh (que supongo que normalmente usas)

  • Deberá tener el paquete lrzsz instalado en ambos sistemas.

Luego, para transferir un archivo zyxel.png desde el control remoto al host local:

antti@local:~$ zssh remote Press ^@ (C-Space) to enter file transfer mode, then ? for help ... antti@remote:~$ sz zyxel.png **B00000000000000 ^@ zssh > rz Receiving: zyxel.png Bytes received: 104036/ 104036 BPS:16059729 Transfer complete antti@remote:~$

La carga se realiza de manera similar, excepto que simplemente cambia rz (1) y sz (1) .

Los usuarios de Putty pueden probar Le Putty , que tiene una funcionalidad similar.