2014-10-08 98 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列出被转发的远程节点。