erlang - 短路 Erlang 端口映射器守护进程

标签 erlang erlang-shell erlang-driver

给定远程beam.smp服务的已知TCP端口和名称,以及已知的cookie,是否可以短路Erlang分发协议(protocol)的Erlang端口映射器守护进程握手阶段并直接建立Erlang shell目标beam.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端口映射器守护程序或绑定(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)来复制(或调用) inet_tcp_dist 除了调用 erl_epmd 的部分。主要是,您需要提供您自己的 setup/5 的实现.

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

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

如果 epmd 丢失了节点的踪迹(例如,它被杀死,不幸的是 epmd 是单点故障),则此方法特别有用。为此:

  1. 创建到 epmd 的 TCP 连接,并发送数据包以使用其已知端口和名称来注册丢失的节点。保持 TCP 连接打开,否则 epmd 将取消注册该节点。
  2. 使用上一步中使用的名称将新 shell 连接到丢失的节点。
  3. 然后,您可以关闭 (1) 中建立的连接,并最终通过调用 erl_epmd:register_node/2 将丢失的节点重新注册到 epmd。 (如果需要的话,发送精心设计的 tcp_closed 消息)。

关于erlang - 短路 Erlang 端口映射器守护进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19441578/

相关文章:

Riak 数据库上的 Erlang MapReduce 出现异常

erlang - 匿名函数和模式匹配

erlang - 循环中的错误

C 可变参数函数行为与 Erlang 驱动程序中预期的等效代码不同

erlang - 在erlang receive语句中引入 'save queue'的目的是什么

erlang - 如何为 erlang 中的模块生成 AST?

list - 列表中的数字打印为 "\f"

c - 如何编译 Erlang 驱动程序?

ssl - Erlang:使用 SSL 的 inets httpd

节点之间的 Erlang Ets 表