【发布时间】:2011-09-03 22:18:23
【问题描述】:
情况: A 和 B 是远程主机。 本地机器可以 SSH 进入 A,但不能进入 B。 B 只接受来自 A 的 SSH 连接。
问题: 是否可以在本地机器上使用fabric在主机B上执行命令,最好不用在A上安装fabric?
【问题讨论】:
情况: A 和 B 是远程主机。 本地机器可以 SSH 进入 A,但不能进入 B。 B 只接受来自 A 的 SSH 连接。
问题: 是否可以在本地机器上使用fabric在主机B上执行命令,最好不用在A上安装fabric?
【问题讨论】:
我只是要回答 SSH 部分:是的,您可以设置一个双隧道 - 一个从本地到 A 的 SSH,它从辅助本地端口(如 2121)隧道到 B 上的端口 21,然后你可以 SSH 到 localhost:2121 并登录 B。我用 PuTTY 做过类似的事情。
在织物中实现这一点作为练习。
【讨论】:
看起来这可能是诀窍:
【讨论】:
【讨论】:
从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
【讨论】:
我设法通过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
【讨论】:
作为 yeforriak 答案的变体,如果您只想为单个任务执行此操作,您可以这样做:
from fabric.api import *
@with_settings(forward_agent=True, gateway='user@remote_MachineA')
@hosts(['user@remote_MachineB'])
def function1():
run('hostname')
【讨论】: