<p>因为Fabric v1.5+有一个名为<code>remote_tunnel</code>的方法来解决蔓越莓的问题</p>
<p>我使用了一个简单的命令(hostname)来说明解决方案,但是可以使用其他任何命令。如您所见,我们通过使用远程计算机作为跳转主机从本地计算机调用了要在远程计算机B上执行的命令:</p>
<pre><code>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")
</code></pre>
<p>如果在本地计算机中执行此fab文件,我们将得到:</p>
<pre><code>[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
</code></pre>
<p>为此,使用<code>GatewayPorts yes</code>配置此跳转机器ssh守护进程非常重要。否则,只能从本地主机访问远程隧道。</p>
<p>检查:</p>
<pre><code>tcp 0 0 127.0.0.1:22022 0.0.0.0:* LISTEN
</code></pre>
<p>对:</p>
<pre><code>tcp 0 0 0.0.0.0:22022 0.0.0.0:* LISTEN
</code></pre>
<p>有关详细信息,请查看官方文档<a href="http://docs.fabfile.org/en/latest/api/core/context_managers.html#fabric.context_managers.remote_tunnel" rel="nofollow">http://docs.fabfile.org/en/latest/api/core/context_managers.html#fabric.context_managers.remote_tunnel</a></p>