情况: A和B是远程主机。 本地机器可以SSH到A,但不能B. B仅接受来自A的SSH连接。
问题: 是否可以在本地计算机上使用结构来执行主机B上的命令,最好不必在A上安装结构?
答案 0 :(得分:11)
我设法用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并告诉fabric使用~/.ssh/config
使用use_ssh_config = True
,文档here
答案 1 :(得分:4)
看起来这可能是诀窍:
答案 2 :(得分:3)
由于Fabric v1.5 +有一个名为remote_tunnel
的方法来解决蔓越莓的情况
我使用了一个简单的命令(hostname)来说明解决方案,但可以使用任何其他命令。如您所见,我们通过使用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
答案 3 :(得分:2)
答案 4 :(得分:1)
作为yeforriak答案的一种变体,如果您只想针对单个任务执行此操作,则可以执行以下操作:
from fabric.api import *
@with_settings(forward_agent=True, gateway='user@remote_MachineA')
@hosts(['user@remote_MachineB'])
def function1():
run('hostname')
答案 5 :(得分:0)
我只是要回答SSH部分:是的,你可以建立一个双隧道 - 一个从本地到A的SSH,从一个辅助本地端口(如2121)隧道到B上的端口21,然后你可以通过SSH连接到localhost:2121并登录B.我已经用PuTTY做了类似的东西。
在结构中实现它是一种练习。