使用ssh端口转发运行Erlang Observer

时间:2014-10-08 03:59:27

标签: ssh erlang portforwarding ssh-tunnel

我有一个远程Erlang节点和本地开发人员的PC。我想启动本地节点debug@127.0.0.1,启动观察者,调用c:nl/1和其他调试操作。我写了这个:

   #!/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 dev@127.0.0.1 -setcookie ABCDEFFJKGSK \
   -kernel inet_dist_listen_min 9001 inet_dist_listen_max 9001 \
   -eval "net_adm:ping('nodename@target')."
   pkill -f ssh.*-fxN.*target

但是当我运行这个脚本时,我得到的信息如下:

  

bind:已在使用的地址错误的本地转发规范   ':debian:'Erlang / OTP 17 [erts-6.1] [来源] [64位] [smp:4:4]   [async-threads:10] [kernel-poll:false]

     

Eshell V6.1(以^ G中止)(dev@127.0.0.1)1>

如何在本地计算机上运行observer并将它们连接到远程节点?

4 个答案:

答案 0 :(得分:3)

至少有三件事:

  • 未正确关闭TCP连接
  • 节点名称
  • 隧道错误

如果您关闭进程,该进程与kill保持TCP连接,则可以进入TIME_WAIT状态几分钟:read more

ssh -L port:host:hostport中,您有2个组件:

  • 第一个是port,这就是说,在我的本地机器上使用此端口
  • host:hostport表示:"从远程计算机"连接到此主机和端口,您可以想象,您已经在远程计算机上并且您想要连接到第三个

您正在使用hostname内部,在本地计算机上进行评估并返回debian这是没有意义的,因为可能debian并不意味着远程机器上的任何东西。尝试使用:

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

这应该按预期工作,没有关于规范的错误。

Erlang distributed使用节点名来定位计算机。在您调用的本地节点上:

net_adm:ping('nodename@target').

尝试直接在目标上联系端口4369而不进行端口转发。

Erlang distributed旨在用于本地可信网络。通过端口转发进行设置真的很难。 您可以在远程计算机上启动调试节点并连接到您的系统 - 这应该很容易。如果远程系统具有X服务器,您甚至可以转发观察者窗口(ssh -Y)。

答案 1 :(得分:2)

首先找到远程端口:

   $ 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 debug@127.0.0.1 -setcookie if-server-has-one -hidden -run observer

N.B。:如果服务器使用-sname,您还需要使用-sname,因为Erlang™。出于同样的原因,您还需要更改系统的主机名以匹配目标主机。

在观察者中,转到节点 - 连接节点并输入some_node@127.0.0.1

您还可以获得远程shell:

$ erl -name debug@127.0.0.1 -setcookie if-server-has-one -remsh some_node@127.0.0.1

答案 2 :(得分:1)

我尝试自动执行相同的ssh端口转发方法并进入此项目:https://github.com/virtan/ccl

使用添加sys.config {ccl, [ {slaves, [ {"ef1", "ef1.somehost.net", use} ]} ]} 并启动ccl应用程序以建立到ef1.somehost.net的隧道,并启动并连接远程节点。

答案 3 :(得分:0)

@ tkowal的答案最能解释这里的问题,但我想分享一下我是如何处理这个问题的。我经常喜欢将epmd -names列出的端口转发到localhost,这样我就可以轻松使用本地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列出正在转发的远程节点。