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:~/
Puede usar el protocolo SCP para transferir un archivo. Puede consultar este enlace
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).
"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.