给定远程Beam.smp服务的已知TCP端口和名称以及已知的cookie,可以使Erlang分发协议(protocol)的Erlang Port Mapper Daemon握手阶段短路,并直接建立到目标Beam的Erlang Shell .smp服务?

该协议(protocol)记录在这里:

http://erlang.org/doc/apps/erts/erl_dist_protocol.html

和这里:

https://github.com/blackberry/Erlang-OTP/blob/master/lib/kernel/internal_doc/distribution_handshake.txt

但是对我来说,尚不清楚recv_challenge/send_challenge身份验证是通过Erlang Port Mapper守护程序还是绑定(bind)到特定端口的beam.smp服务进行的。

感谢您的时间。

最佳答案

身份验证在Erlang VM(beam或beam.smp)之间进行。 epmd仅处理端口注册。仅仅使epmd短路并不是一件容易的事,其他方法可能更适合您的实际需求。

不幸的是, epmd不是默认分发协议(protocol)(inet_tcp_dist)或其SSL counterpart的选项。有两个未公开的选项,看起来像您可以禁用epmd(-no_epmd)或提供替代实现(epmd_module)。但是,分发协议(protocol)对epmd的依赖性为hard-coded,并且不依赖于这些选项。

因此,您可以:

  • 在代码服务器级别覆盖erl_epmd模块(可能是最肮脏的方法);
  • 提供了另一种分发协议(protocol),该协议(protocol)将复制(或调用) inet_tcp_dist ,但调用erl_epmd的部分除外。主要是,您需要提供自己的setup/5实现。

  • 如果您不希望 shell 程序节点连接到epmd来注册其名称,则还需要覆盖listen/1。在这种情况下,您可以将-no_epmd传递到命令行。

    或者,,您可以连接到epmd来注册监听节点,以便使用默认协议(protocol)创建 shell 连接。

    如果epmd失去了对节点的跟踪(例如,它被杀死,不幸的是epmd是单点故障),则此方法特别有用。为此:
  • 创建一个与epmd的TCP连接,并发送一个数据包以使用其已知的端口和名称注册丢失的节点。保持TCP连接处于打开状态,否则epmd将注销该节点。
  • 使用上一步中使用的名称将新的Shell连接到丢失的节点。
  • 然后可以关闭在(1)中建立的连接,并最终通过调用erl_epmd:register_node/2(并在需要时发送精心制作的tcp_closed消息)将丢失的节点重新注册到epmd。
  • 关于erlang - 短路Erlang端口映射器守护程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19441578/

    10-10 12:29