2014-10-08 32 views
1

我有一個遠程Erlang節點和本地開發人員的PC。我想啓動本地節點[email protected],啓動觀察者,調用c:nl/1和其他調試操作。我寫了這個:使用ssh端口轉發運行Erlang Observer

#!/bin/sh 
    export ERL_EPMD_PORT=43690 
    PORT=`ssh -l user target -p 5022 "/usr/bin/epmd -names" | awk '$2 == "target-node" {print $5}'` 
    pkill -f ssh.*-fxN.*target 
    ssh -fxNL 43690:`hostname`:4369 target -p 5022 -l user 
    ssh -fxNL $PORT:`hostname`:$PORT target -p 5022 -l user 
    ssh -fxNR 9001:`hostname`:9001 target -p 5022 -l user 
    erl -name [email protected] -setcookie ABCDEFFJKGSK \ 
    -kernel inet_dist_listen_min 9001 inet_dist_listen_max 9001 \ 
    -eval "net_adm:ping('[email protected]')." 
    pkill -f ssh.*-fxN.*target 

但是當我運行此腳本,我得到這樣的消息:已經在使用中壞本地轉發規範 地址:

綁定「:Debian的:」二郎/ OTP 17 [專家評審組(異步線程:10)[kernel-poll:false]

Eshell V6.1(使用^ G中止)(dev @@@)[sip:4:4] [異步線程: 127.0.0.1)1>

如何在本地機器上運行觀察器並將它們連接到遠程節點?

回答

3

至少有三件事情:

  • 不關閉TCP連接正常
  • 節點名稱
  • 隧道錯

如果關閉過程中,保持與kill TCP連接它可以進入TIME_WAIT狀態幾分鐘:read more

ssh -L port:host:hostport,你有兩個部分組成:

  • 第一個是port這說,用我的本地機器上的這個端口
  • host:hostport意思是:「連接到這臺主機和端口從遠程機」,你可以想像,你已經在遠程機器上,你要連接到第三個

您正在使用hostname內部,在您的本地計算機上進行評估,並返回debian,這沒有意義,因爲可能debian不代表遠程計算機上的任何內容。嘗試使用:

ssh -fxNR 9001:localhost:9001 target -p 5022 -l user 

這應該按預期工作,沒有關於規範的錯誤。

Erlang分佈式使用節點名稱來定位機器。在您撥打的本地節點上:

net_adm:ping('[email protected]'). 

它試圖在沒有端口轉發的情況下直接在目標上聯繫端口4369。

Erlang分佈式設計用於本地可信網絡。通過端口轉發來設置它真的很難。 您可以啓動遠程計算機上的調試節點並連接到您的系統 - 這應該很簡單。如果遠程系統具有X服務器,則甚至可以轉發觀察者窗口(ssh -Y)。

1

我試圖自動化同一SSH端口轉發方法,並來到了這個項目:https://github.com/virtan/ccl

添加sys.config與 {ccl, [ {slaves, [ {"ef1", "ef1.somehost.net", use} ]} ]} 並啓動CCL應用程序獲取隧道ef1.somehost.net建立遠程節點開始並連接。

1

首先找到遠程端口:

$ ssh remote-host "epmd -names" 
    epmd: up and running on port 4369 with data: 
    name some_node at port 58769 

注意端口上運行EPMD本身和你有興趣調試節點的端口。重新連接到這些端口的遠程主機轉發:

$ ssh -L 4369:localhost:4369 -L 58769:localhost:58769 remote-host 

在您的計算機上,啓動一個隱藏的Erlang節點上運行的應用程序觀察員:

$ erl -name [email protected] -setcookie if-server-has-one -hidden -run observer 

注意:如果服務器使用的是-sname,你需要也使用-sname,因爲Erlang™。出於同樣的原因,您還需要更改系統的主機名以匹配目標主機。

在觀察者中,轉到節點 - 連接節點和類型[email protected]

您還可以得到一個遠程shell:

$ erl -name [email protected] -setcookie if-server-has-one -remsh [email protected] 
0

@ tkowal的回答最好在這裏解釋了這個問題,但我想分享我如何處理這個問題。我經常喜歡將端口號爲epmd -names的端口轉發到本地主機,這樣我就可以輕鬆地使用本地GUI工具來檢查遠程節點上的狀態。我寫了一個shell script automatically forward the ports for me,所以我不必記住一堆命令。它易於使用:

$ ./epmd_port_forwarder --server=remote-erlang-server.net 
epmd: Cannot connect to local epmd 
Killed local epmd 
epmd: up and running on port 4369 with data: 
name remote_erlang_node at port 46259 
Forwarding ports 
+ ssh -N -L 4369:localhost:4369 -L 46259:localhost:46259 remote-erlang-server.net 

之後啓動腳本,那麼你可以使用epmd -names列出被轉發的遠程節點。