【问题标题】:fabric: how to double tunnel面料:如何双隧道
【发布时间】:2011-09-03 22:18:23
【问题描述】:

情况: A 和 B 是远程主机。 本地机器可以 SSH 进入 A,但不能进入 B。 B 只接受来自 A 的 SSH 连接。

问题: 是否可以在本地机器上使用fabric在主机B上执行命令,最好不用在A上安装fabric?

【问题讨论】:

    标签: python ssh fabric


    【解决方案1】:

    我只是要回答 SSH 部分:是的,您可以设置一个双隧道 - 一个从本地到 A 的 SSH,它从辅助本地端口(如 2121)隧道到 B 上的端口 21,然后你可以 SSH 到 localhost:2121 并登录 B。我用 PuTTY 做过类似的事情。

    在织物中实现这一点作为练习。

    【讨论】:

      【解决方案2】:

      看起来这可能是诀窍:

      https://gist.github.com/856179

      【讨论】:

      • 试过了,它完全符合 OP 要求的 +1
      【解决方案3】:

      【讨论】:

        【解决方案4】:

        从Fabric v1.5+开始有一个方法叫remote_tunnel来解决蔓越莓的情况

        我使用了一个简单的命令(主机名)来说明解决方案,但也可以使用任何其他命令。如您所见,我们使用 remote_machineA 作为跳转主机,从 local_machine 调用了要在 remote_machineB 上执行的命令:

        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 中执行这个 fab 文件,这就是我们得到的:

        [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
        

        为此,使用GatewayPorts yes 配置此跳转机ssh 守护程序非常重要。否则只能从 localhost 访问远程隧道。

        检查:

        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

        【讨论】:

          【解决方案5】:

          我设法通过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、example here 并使用 use_ssh_config = True 告诉fabric 使用您的~/.ssh/config,文档here

          【讨论】:

            【解决方案6】:

            作为 yeforriak 答案的变体,如果您只想为单个任务执行此操作,您可以这样做:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-03-04
              • 1970-01-01
              • 1970-01-01
              • 2019-07-15
              • 1970-01-01
              • 2015-10-08
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多