ткань: как удвоить туннель - PullRequest
17 голосов
/ 28 мая 2011

Положение: A и B - удаленные хосты. Локальная машина может SSH в A, но не B. B принимает только SSH-соединения от A.

Вопрос: Можно ли использовать матрицу на локальном компьютере для выполнения команд на хосте B, предпочтительно без необходимости устанавливать матрицу на A?

Ответы [ 5 ]

11 голосов
/ 16 февраля 2016

Мне удалось добиться этого с помощью env.gateway следующим образом:

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 только для включения пересылки локального агента SSH на удаленный конец

В качестве альтернативы, вы можете использовать ssh ProxyCommand, пример здесь и указать матрице использовать ваш ~/.ssh/config, используя use_ssh_config = True, документация здесь

4 голосов
/ 22 июля 2011

Похоже, это может подвох:

https://gist.github.com/856179

3 голосов
/ 17 декабря 2014

Начиная с Fabric v1.5 +, существует метод под названием remote_tunnel для решения ситуации с клюквой

Я использовал простую команду (имя хоста) для иллюстрации решения, но вместо этого можно использовать любую другую команду. Как вы можете видеть, мы вызвали команду для выполнения на remote_machineB из local_machine, используя remote_machineA в качестве хоста перехода:

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")

Если вы запустите этот потрясающий файл в local_machine, мы получим следующее:

[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

Для этого очень важно сконфигурировать этот демон ssh для перемычки с GatewayPorts yes. В противном случае удаленный туннель будет доступен только с локального хоста.

Проверка:

tcp        0      0 127.0.0.1:22022         0.0.0.0:*               LISTEN     

против

tcp        0      0 0.0.0.0:22022           0.0.0.0:*               LISTEN     

Для получения дополнительной информации проверьте официальную документацию http://docs.fabfile.org/en/latest/api/core/context_managers.html#fabric.context_managers.remote_tunnel

2 голосов
/ 11 апреля 2012

Я просто оставлю это здесь: http://www.popcornfarmer.com/2009/01/ssh-tunneling-tutorial/

0 голосов
/ 28 мая 2011

Я просто собираюсь ответить на часть SSH: Да, вы можете настроить двойной туннель - один SSH от локального до A, который туннелирует от вторичного локального порта (например, 2121) до порта 21 на B, а затем Вы можете подключиться по SSH к localhost: 2121 и войти в систему B. Я сделал такие вещи с PuTTY.

Реализация того, что в ткани оставлено как упражнение.

...