2013-10-18 71 views
4

給定遠程beam.smp服務的已知TCP端口和名稱以及已知的cookie,是否可以將Erlang分發協議的Erlang端口映射程序守護程序握手階段和直接建立一個Erlang shell到目標beam.smp服務?短路Erlang端口映射程序守護進程

該協議被記錄在這裏:

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驗證它是我不清楚守護進程或綁定到特定端口的beam.smp服務。

謝謝你的時間。

回答

3

在Erlang虛擬機(beam或beam.smp)之間進行身份驗證。 epmd只處理端口註冊。簡單地將epmd短路並非易事,其他方法可能更適合您的實際需要。

不幸的是,epmd不適用於默認分配協議inet_tcp_dist)或其SSL counterpart。有兩個未公開的選項,看起來像可以禁用epmd(-no_epmd)或提供替代實施(epmd_module)。但是,分發協議對epmd的依賴性是hard-coded,並且不依賴於這些選項。

所以,你可以:

  • 覆蓋在代碼服務器級別(可能是最髒的方法)的erl_epmd模塊;
  • 提供了一個可選的分發協議,除了調用erl_epmd的部分之外,它將複製(或調用)inet_tcp_dist。主要是,您需要提供您自己的setup/5的實現。

如果您不希望shell節點連接到epmd以註冊其名稱,則還需要覆蓋listen/1。在這種情況下,您可以將-no_epmd傳遞到命令行。

備選地,可以連接到EPMD爲了創建使用默認協議的殼連接以註冊監聽節點。

如果epmd丟失了一個節點的路徑(例如它被殺死,不幸的是epmd是單點故障),該方法特別有用。爲此,請執行以下操作:

  1. 創建到epmd的TCP連接併發送數據包,以使用其已知的端口和名稱註冊丟失的節點。保持打開TCP連接或epmd將取消註冊節點。
  2. 使用上一步中使用的名稱將新的外殼連接到丟失的節點。
  3. 然後,您可以關閉在(1)中建立的連接,並通過調用erl_epmd:register_node/2(並根據需要發送精心製作的tcp_closed消息)最終將丟失的節點重新註冊到epmd。
+0

謝謝保羅,這是非常有幫助的。 –