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
intentado esto y se hace exactamente lo que el OP estaba pidiendo +1 – radman
funciona, aunque no puede manejar múltiples hosts hasta ahora –