给定远程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
模块(可能是最肮脏的方法); inet_tcp_dist
,但调用erl_epmd的部分除外。主要是,您需要提供自己的setup/5
实现。 如果您不希望 shell 程序节点连接到epmd来注册其名称,则还需要覆盖
listen/1
。在这种情况下,您可以将-no_epmd
传递到命令行。或者,,您可以连接到epmd来注册监听节点,以便使用默认协议(protocol)创建 shell 连接。
如果epmd失去了对节点的跟踪(例如,它被杀死,不幸的是epmd是单点故障),则此方法特别有用。为此:
erl_epmd:register_node/2
(并在需要时发送精心制作的tcp_closed
消息)将丢失的节点重新注册到epmd。 关于erlang - 短路Erlang端口映射器守护程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19441578/