Usando un canal SSH ya establecido

50

Tengo una conexión ssh ya establecida entre dos máquinas.

¿Hay alguna manera de enviar comandos a la máquina remota desde un script de shell que se ejecuta en la máquina local, utilizando la conexión ya abierta y sin iniciar otra sesión ssh?

SWeko
fuente

Respuestas:

56

Es muy simple con versiones suficientemente recientes de OpenSSH si planifica con anticipación.

Abra una conexión maestra la primera vez. Para conexiones posteriores, enrute las conexiones esclavas a través de la conexión maestra existente. En su ~/.ssh/config, configure el uso compartido de la conexión para que se realice automáticamente:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

Si inicia una sesión ssh con el mismo (usuario, puerto, máquina) que una conexión existente, la segunda sesión se tunelizará sobre la primera. Establecer la segunda conexión no requiere una nueva autenticación y es muy rápido.

Gilles 'SO- deja de ser malvado'
fuente
Parece que el segundo no se registrará en / var / log / secure o /var/log/auth.log. Sin embargo, ¿se registrará el segundo en / var / log / wtmp?
SOUser
@XichenLi /var/log/securey /var/log/auth.logregistrar conexiones SSH; una conexión esclava no aparece allí porque se complementa con una conexión existente. Si su sesión ssh asigna un terminal (es decir, ssh somehostsin comando proporcionado, o ssh -t), que está (normalmente) conectado wtmp, independientemente de cómo apareció ese terminal (sshd, cualquier método utilizado para establecer la conexión, la aplicación del emulador de terminal, ...).
Gilles 'SO- deja de ser malvado'
2
También puede usar ControlPersist 600el retraso en segundos de que el socket esté inactivo antes de que se elimine automáticamente. De lo contrario, se cerrará automáticamente cuando finalice la conexión maestra. Eso no es bueno para ejecutar una serie de comandos de forma remota (por ejemplo, una serie de comandos rsync en diferentes carpetas)
2
Si no desea editar la configuración global, también puede usar las opciones -S(especificar socket) y -M(crear conexión maestra) del cliente SSH.
Yankee
22

Eso es bastante fácil de lograr usando la herramienta nc y los túneles ssh.

1. Abrir el túnel SSH

En su sesión ssh, escriba ~Cuna nueva línea. Obtendrá el mensaje ssh "service console" que se ve así:

ssh> 

Escriba el comando de reenvío local para abrir un túnel ssh:

ssh> -L22000:targethost:22001
Forwarding port.

¿Dónde targethostestá el nombre de host o la dirección IP de la máquina a la que está conectado?

Ahora, suponiendo que el servidor ssh en la máquina de destino no esté configurado para prohibir túneles, tiene el reenvío de conexión deseado: el sshcliente en su máquina escucha el puerto 22000, y reenviará cualquier tráfico enviado al puerto 22001 targethost.

2. Inicie un servidor de red en la máquina remota.

Esto es tan simple como ingresar en su sesión ssh ya abierta el siguiente comando:

remote$ nc -l localhost 22001 | sh

Esto iniciará un servidor TCP que escucha en el puerto 22001, que es el puerto objetivo de nuestro túnel ssh, y enrutará los datos recibidos (presumiblemente, comandos de shell) a una targethostinstancia de shell.

3. Envía tu guión por el túnel

local$ cat yourscript.sh | nc localhost 22000

Esto enviará el cuerpo del script a su túnel ssh y terminará ejecutándose en un shell en el targethost. Verá la salida del script en su terminal con la sesión ssh.


También notaré que el túnel ssh (paso 1) en este escenario no es estrictamente necesario; también podría abrir el servidor y conectarse directamente a través de Internet. Sin embargo, necesitará usar el túnel si no se puede llegar directamente al host de destino (por ejemplo, detrás de un NAT), o si se desea el cifrado ssh.

ulidtko
fuente
3
Gran respuesta. Técnicamente, para llegar a la consola de servicio, el ~personaje debe venir después de una nueva línea, por LF ~ Clo que probablemente sea una secuencia mejor.
Alexios
@Alexios, correcto.
ulidtko
Truco increíble! Para el registro, la página de manual de ssh muestra más información al respecto (desplácese hacia abajo a la sección llamada "PERSONAJES DE ESCAPE")
Carles Sala
@CarlesSala también es bueno saber que less, el localizador predeterminado común, admite búsquedas que pueden ahorrarle un poco de desplazamiento si conoce sus palabras clave: simplemente escriba man ssh /ESCAPEy ya está.
ulidtko
@ulidtko seguro, pero que yo sepa, uno no puede vincular un comando CLI en un comentario SO, por lo que la página del manual html me pareció una mejor opción ;-)
Carles Sala