Usando algunas características poco conocidas y raramente usadas de la implementación de openssh , ¡puede lograr exactamente lo que quiere!
- se aprovecha de la situación actual
- puede utilizar el directorio de trabajo donde se encuentre
- no requiere ningún tipo de configuración de túnel antes de la sesión comienza
- no es necesario abrir una terminal separada o conexión
- se puede usar como una operación ú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 uno de los local>
, remote>
y ssh>
en los ejemplos a continuación.
local> ssh [email protected]
remote> ~C
ssh> -L6666:localhost:6666
remote> nc -l 6666 < /etc/passwd
remote> ~^Z
[suspend ssh]
[1]+ Stopped ssh [email protected]
local> (sleep 1; nc localhost 6666 > /tmp/file) & fg
[2] 17357
ssh [email protected]
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 que quieren ir la otra dirección, por ejemplo, si quiere hacer algo así como la transferencia de su archivo ~/.ssh/id_rsa.pub
de el equipo local para el archivo de la ~/.ssh/authorized_keys
máquina remota.
local> ssh [email protected]
remote> ~C
ssh> -R5555:localhost:5555
remote> ~^Z
[suspend ssh]
[1]+ Stopped ssh [email protected]
local> nc -l 5555 < ~/.ssh/id_rsa.pub &
[2] 26607
local> fg
ssh [email protected]
remote> nc localhost 5555 >> ~/.ssh/authorized_keys
remote> cat ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2ZQQQQBIwAAAQEAsgaVp8mnWVvpGKhfgwHTuOObyfYSe8iFvksH6BGWfMgy8poM2+5sTL6FHI7k0MXmfd7p4rzOL2R4q9yjG+Hl2PShjkjAVb32Ss5ZZ3BxHpk30+0HackAHVqPEJERvZvqC3W2s4aKU7ae4WaG1OqZHI1dGiJPJ1IgFF5bWbQl8CP9kZNAHg0NJZUCnJ73udZRYEWm5MEdTIz0+Q5tClzxvXtV4lZBo36Jo4vijKVEJ06MZu+e2WnCOqsfdayY7laiT0t/UsulLNJ1wT+Euejl+3Vft7N1/nWptJn3c4y83c4oHIrsLDTIiVvPjAj5JTkyH1EA2pIOxsKOjmg2Maz7Pw== [email protected]
Un poco de explicación está en orden.
El primer paso es abrir un LocalForward
; si usted no tiene ya uno estableció entonces se puede utilizar el carácter de escape ~C
para abrir una línea de comandos 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 una 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 "navaja suiza TCP/IP"; es un programa útil simple pero muy flexible y . 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 ya la espera de otro programa para conectarse a ese puerto por lo que puede enviar el contenido de /etc/passwd
.
siguiente que hacen 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 shell.
Una vuelta en el sistema local puede utilizar nc
para conectarse a la remitido puerto 6666. Nota la falta de un -l
en este caso porque esa opción dice nc
para escuchar en un puerto como si se tratara de un servidor que es no es lo que queremos; en su lugar, queremos simplemente utilizar nc
como cliente a conectar a la que ya escucha nc
en el lado remoto.
Se requiere que el resto de la magia alrededor del comando nc
porque si recuerdan anterior dije que el proceso ssh
estaba temporalmente suspendido, por lo que el &
pondrá toda la (sleep + nc)
expresión en el fondo y la sleep
le da tiempo suficiente para ssh a volver al primer plano con fg
.
En el segundo ejemplo, la idea es básicamente el mismo, excepto establecimos un túnel que va la otra dirección utilizando -R
en lugar de -L
modo que establecemos una RemoteForward
. Y luego en el lado local es donde desea utilizar el argumento -l
al nc
.
El carácter de escape por defecto es ~ pero esto se puede cambiar 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 el ssh manpage
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).
Tal vez entendí mal algo, pero ¿por qué no puedes usar scp directamente? Con las claves almacenadas, no es necesario ingresar ninguna contraseña. –
El problema con el uso de scp es que necesita escribir el nombre/ipaddr del host local, autenticar, etc. – Nick