2011-05-28 19 views
17

Situación: A y B son hosts remotos. máquina local puede SSH en A, pero no B. B sólo acepta conexiones SSH de A.tela: cómo duplicar el túnel

Pregunta: ¿Es posible el uso de la tela en la máquina local para ejecutar comandos en el host B, preferiblemente sin tener que instalar tela en A?

Respuesta

0

Voy a responder la parte SSH: Sí, puede configurar un doble túnel: un SSH desde local a A que tuneliza desde un puerto local secundario (como 2121) al puerto 21 en B, y entonces puedes SSH a localhost: 2121 e iniciar sesión en B. He hecho cosas así con PuTTY.

Implementando eso en la tela se deja como un ejercicio.

4

Parece que esta fuerza para el truco:

https://gist.github.com/856179

+1

intentado esto y se hace exactamente lo que el OP estaba pidiendo +1 – radman

+0

funciona, aunque no puede manejar múltiples hosts hasta ahora –

3

Desde v1.5 + Tela hay un método llamado remote_tunnel para resolver la situación de arándano

He utilizado un comando simple (nombre de host) para ilustrar la solución, pero se puede usar cualquier otro comando en su lugar. Como se puede ver, hemos invocado un comando a ser ejecutado el remote_machineB de LOCAL_MACHINE utilizando remote_machineA como anfitrión salto:

from fabric.api import settings, env, run, remote_tunnel 

env.hosts=["[email protected]_machineA"] 

def funct1(): 
    def func1b(host): 
     with settings(host_string=host): 
      run("hostname") 

    with remote_tunnel(remote_port=22022, local_port=22, 
         local_host="remote_machineB", remote_bind_address="0.0.0.0"): 
     funct1b("[email protected]_machineA:22022") 

Si se ejecuta este archivo fab en LOCAL_MACHINE esto es lo que obtenemos:

[[email protected]_machine ~]# fab hostname_check 
[[email protected]_machineA] Executing task 'hostname_check' 
[[email protected]_machineA:22022] run: hostname 
[[email protected]_machineA:22022] rtunnel: opened reverse tunnel: (u'X.X.3.75', 55804) -> ('X.X.3.78', 22) -> ('remote_machineB', 22) 
[[email protected]_machineA:22022] out: remote_machineB 
[[email protected]_machineA:22022] out: 

Terminated 

Para hacerlo, es muy importante configurar este dashmon ssh de la máquina de salto con GatewayPorts yes. De lo contrario, el túnel remoto solo sería accesible desde el host local.

Comprobar:

tcp  0  0 127.0.0.1:22022   0.0.0.0:*    LISTEN  

frente:

tcp  0  0 0.0.0.0:22022   0.0.0.0:*    LISTEN  

Para obtener más información consulte la documentación oficial http://docs.fabfile.org/en/latest/api/core/context_managers.html#fabric.context_managers.remote_tunnel

11

me las arreglé para lograr esto con env.gateway de la siguiente manera:

from fabric.api import * 

env.forward_agent = True 
env.gateway = '[email protected]_MachineA' 
env.hosts = ['[email protected]_MachineB'] 

def function1(): 
    run('hostname') 

env.forward_agent = True es allí sólo para activar el reenvío de su agente local SSH al extremo remoto

Como alternativa, puede usar ssh ProxyCommand, example here y decirle a la tela a utilizar su ~/.ssh/config usando use_ssh_config = True, documentación here