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?
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.
/var/log/secure
y/var/log/auth.log
registrar 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 somehost
sin comando proporcionado, ossh -t
), que está (normalmente) conectadowtmp
, independientemente de cómo apareció ese terminal (sshd, cualquier método utilizado para establecer la conexión, la aplicación del emulador de terminal, ...).ControlPersist 600
el 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)-S
(especificar socket) y-M
(crear conexión maestra) del cliente SSH.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í:
Escriba el comando de reenvío local para abrir un túnel ssh:
¿Dónde
targethost
está 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
ssh
cliente en su máquina escucha el puerto 22000, y reenviará cualquier tráfico enviado al puerto 22001targethost
.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:
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
targethost
instancia de shell.3. Envía tu guión por el túnel
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.
fuente
~
personaje debe venir después de una nueva línea, porLF ~ C
lo que probablemente sea una secuencia mejor.less
, el localizador predeterminado común, admite búsquedas que pueden ahorrarle un poco de desplazamiento si conoce sus palabras clave: simplemente escribaman ssh
/ESCAPE
y ya está.