Fabric 的远程命令经由 SSH 传输。要把这条 SSH 连接穿过 SOCKS 服务器,就给 Fabric 一个会说 SOCKS 并返回目标字节流的连接器。

Fabric 2 引入的 Connection API 接受一个命令字符串作为它的 gateway。Fabric 把该字符串当作 ProxyCommand 使用。如果已有一个兼容 OpenBSD、支持其代理选项的 nc,配置可以是:

from fabric import Connection

connection = Connection(
    "app.example.net",
    user="deploy",
    gateway="nc -X 5 -x proxy.example.net:1080 %h %p",
)

这个示例使用常规 SSH 端口 22。连接器的 -X 5 选择 SOCKS5,而 -x 指定代理端点。主机和端口占位符提供 SSH 目标。对于公开的 SSH 目标,SOCKS5 代理列表中无需认证的端点只要允许该目标和端口,就可以填入代理地址。请按机器上实际安装的连接器的选项来配置该命令;名为 nc 的程序并不都提供相同的接口。

连接器在 Fabric 运行的本机上运行。应用服务器并不因为自己是 SSH 目标就需要这个辅助程序。数据流建立之后,Fabric 仍会进行 SSH 协商,并在 deploy 账户(位于 app.example.net)上完成认证。SOCKS 服务器要求的任何认证都属于连接器,且必须由它支持。

Fabric 也可以从 SSH 配置读取 ProxyCommand。当多个 SSH 工具使用同一条路由时,这会很方便。请为连接使用一个既定网关定义,而不是把命令式网关与针对同一目标的独立跳板机网关组合起来。

当中间人是一台 SSH 服务器时

把 Fabric 的 Connection 对象作为 gateway 传入含义不同:Fabric 会连接到那台 SSH 网关,并请求一条通往最终主机的通道。SSH 跳板机请使用这种形式。SOCKS 监听器不是 SSH 服务器,所以它需要上面那种命令式连接器。

这种传输选择也有明确的边界。它只负责为 Fabric 的 SSH 连接选路。在远程主机上执行的命令若随后下载仓库或软件包,会从该主机发起新的出站连接,遵循那个程序自己的代理配置。

相关文章