software examples python ssh fabric

python - examples - pip install fabric



tela: cómo hacer doble túnel (5)

Desde Fabric v1.5 + hay un método llamado remote_tunnel para resolver la situación de cranberry

He usado un comando simple (nombre de host) para ilustrar la solución pero se puede usar cualquier otro comando en su lugar. Como puede ver, hemos invocado un comando para ejecutarse en remote_machineB desde local_machine utilizando remote_machineA como host de salto:

from fabric.api import settings, env, run, remote_tunnel env.hosts=["user@remote_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("user@remote_machineA:22022")

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

[user@local_machine ~]# fab hostname_check [user@remote_machineA] Executing task ''hostname_check'' [user@remote_machineA:22022] run: hostname [user@remote_machineA:22022] rtunnel: opened reverse tunnel: (u''X.X.3.75'', 55804) -> (''X.X.3.78'', 22) -> (''remote_machineB'', 22) [user@remote_machineA:22022] out: remote_machineB [user@remote_machineA:22022] out: Terminated

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

Comprobar:

tcp 0 0 127.0.0.1:22022 0.0.0.0:* LISTEN

versus:

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

Situación: A y B son hosts remotos. La máquina local puede SSH en A, pero no en B. B SOLAMENTE acepta conexiones SSH de A.

Pregunta: ¿Es posible usar el tejido en la máquina local para ejecutar comandos en el Host B, preferiblemente sin tener que instalar el tejido en A?




Solo voy a responder la parte de SSH: Sí, puedes configurar un túnel doble: un SSH de local a A que hace un túnel desde un puerto local secundario (como 2121) al puerto 21 en B, y luego puedes SSH to localhost: 2121 e inicio de sesión en B. He hecho cosas así con PuTTY.

Implementar eso en tela se deja como ejercicio.


env.gateway lograr esto con env.gateway siguiente manera:

from fabric.api import * env.forward_agent = True env.gateway = ''user@remote_MachineA'' env.hosts = [''user@remote_MachineB''] def function1(): run(''hostname'')

env.forward_agent = True solo permite habilitar el reenvío de su agente SSH local al extremo remoto

Alternativamente, puede usar ssh ProxyCommand, ejemplo aquí y decirle a fabric que use su ~/.ssh/config usando use_ssh_config = True , documentación here