¿Ejecutar un comando en la computadora local desde un host SSH remoto conectado?

13

Digamos que me he conectado a una computadora remota a través de SSH. Desde un programa en esta computadora remota, necesito ejecutar un comando en mi computadora local (el iniciador de conexión).

Lo que plantea la pregunta: ¿es posible derivar a la conexión existente entre las dos computadoras para ejecutar un comando en la computadora local?

He considerado ejecutar el comando ssh user@host-of-connecting-party <command>en la computadora remota para establecer una conexión inversa. Pero esto es más difícil de automatizar y requerirá la intervención del usuario. Esperaba poder automatizarlo completamente, o al menos detectar el usuario / nombre de host del usuario conectado.

Aeyoun
fuente
Está claro lo que quieres hacer. Lo que no está claro para mí es la parte en la que dice "Esperaba poder automatizarlo por completo, o al menos detectar el usuario / nombre de host del usuario conectado". ¿Qué quieres decir?
hytromo
"más difícil de automatizar y requerirá la intervención del usuario" es sinónimo de "seguro" en este caso. Si un host remoto pudiera ejecutar comandos en clientes que se conectan a él, eso sería muy inseguro ... imagine que un servidor se ve comprometido y cualquiera que se conecte a él solo infecta su máquina local ... eso sería divertido :)
Sergey

Respuestas:

5

A veces tengo una necesidad similar, siempre y cuando me conecte a través de Putty a nuestro servidor VPN y desde allí a través de ssh a algún otro host, que no es accesible para mí directamente debido a la configuración de VPN.

A veces solo necesito verificar rápidamente algo en un servidor VPN mientras sigo ejecutando mi "sesión ssh". Un enfoque es ejecutar una sesión ssh bajo la screencual, como he notado, agrega algo de retraso en comparación con "ssh regular". Otro enfoque, que me gustaría compartir aquí, es el siguiente:

Mientras está bajo sesión SSH, presione Enter, luego ~, (asegúrese de que no se muestre, es decir, esté en modo comando), luego Ctrl- Z. Esto pondrá el proceso del cliente ssh en un "host" en segundo plano, y obtendrá algo similar a:

[root@client170 ~]# ~^Z [suspend ssh]

[1]+  Stopped                 ssh [email protected]
[root@vps291736 ~]#

Ahora está en el "host", puede hacer lo que quiera (aunque, no estoy seguro de cuánto tiempo se mantendrá viva la sesión ssh), y luego volver a la sesión SSH ejecutándose fg.

Al menos, esto funciona para mí mientras estoy conectado desde una estación de trabajo Win10 a través de Putty en una VM basada en CentOS, y desde esa VM se conecta a través de SSH a algún otro host.

Espero que ayude a alguien!

62mkv
fuente
2
Si usted tiene PermitLocalCommand yesen su .ssh/configpara un anfitrión, también se puede hacer <Enter>~C, entonces !<command>.
Muru
5

La respuesta de @ 62mkv es una solución mucho mejor. Usa eso.

Sin embargo, para completar y curiosidad, si tiene un servidor ssh ejecutándose en su máquina local, puede crear un túnel ssh para permitir conexiones ssh desde el host remoto en el puerto 20202 de regreso al local en el puerto 22. Comando de ejemplo:

ssh -R20202:localhost:22 [email protected]

Esto iniciará una conexión ssh, pero también configurará un túnel de regreso al servidor ssh que se ejecuta en su máquina. Entonces puede hacer esto, cuando ssh'ed en el host remoto:

ssh -p 20202 localuser@localhost

Por supuesto, esto puede volverse confuso rápidamente, especialmente si la técnica está anidada más de una vez. También agrega un poco de latencia, ya que todo lo que ejecuta en su máquina local se devuelve a través del host remoto.

Puede encontrar información adicional sobre el túnel ssh para aquellos cuya curiosidad aún no se ha satisfecho en respuesta a esta pregunta de intercambio de pila de Unix .

starbeamrainbowlabs
fuente
Esta es una excelente respuesta. Exactamente lo que necesitaba para poder hacer ssh en una máquina remota que estaba detrás de un firewall y que solo era accesible a través de teamniewer. Simplemente me conecté a través de teamviewer y luego de la sesión de teamviewer a mi máquina creando el túnel ssh y luego pude abrir tantas sesiones ssh desde mi computadora al control remoto como necesité.
Marian
De hecho, ese es un caso de uso mucho mejor para un túnel como este @Marian. Lo hago yo mismo.
starbeamrainbowlabs
0

Si se puede acceder a su computadora local y remota desde Internet, puede abrir una sesión SSH desde su computadora local en la computadora remota y luego, en esa sesión, abrir otra sesión ssh desde la computadora remota en la computadora local:

localuser@local> ssh remoteuser@remote
Password:
remoteuser@remote> hostname
remote
remoteuser@remote> ssh localuser@local
Password:
localuser@local> hostname
local
localuser@local> exit
remoteuser@remote> exit
localuser@local>

Para automatizar cosas, eche un vistazo a Fabric (se requiere conocimiento de Python)

from fabric.api import *

@hosts('host1')
def clean_and_upload():
    local('find assets/ -name "*.DS_Store" -exec rm '{}' \;')
    local('tar czf /tmp/assets.tgz assets/')
    put('/tmp/assets.tgz', '/tmp/assets.tgz')
    with cd('/var/www/myapp/'):
        run('tar xzf /tmp/assets.tgz')
Sergey
fuente
0

Puede usar sshpass para conectarse a la computadora remota y ejecutar los comandos.

./sshpass -p "password" ssh user@remoteIP 'bash -s < EOI "Your Commands go here" EOI'

Use un script de shell simple en la computadora local y use el código anterior siempre que desee ejecutar comandos en una computadora remota. Esta es una de las formas en que generalmente uso en automatización.

Priyanka
fuente
0

No, no puedes entrar en la sesión existente.

Su aplicación necesitaría una forma de conectarse de nuevo al cliente. SSH funcionaría si el cliente tiene un servidor SSH en ejecución y el servidor puede alcanzar el puerto 22 en el cliente. No sería difícil automatizar si utilizara la autenticación basada en claves en lugar de la autenticación con contraseña; de esta manera, la intervención del usuario no sería necesaria.

Puede encontrar información sobre cómo configurar la autenticación basada en claves aquí: http://tombuntu.com/index.php/2008/02/20/public-key-authentication-for-ssh-made-easy/

Omegamormegil
fuente
0

Si tiene acceso a otra terminal, puede enviar SIGSTOP usando "kill -19 PID" al comando ssh que inició la conexión. Entonces obtendrá el control del terminal en el terminal en la máquina del cliente. Una vez que haya terminado, puede restaurar la conexión ssh simplemente escribiendo fg para activar el cliente ssh.

Pero, por supuesto, la pregunta aquí es: si ya tiene un terminal en la máquina del cliente, ¿por qué haría esto? :)

Hedi
fuente