我有一个远程 Erlang 节点和本地开发人员的 PC。我要启动本地节点debug@127.0.0.1
,启动observer,调用c:nl/1
等调试 Action 。我是这样写的:
#!/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: Address already in use Bad local forwarding specification ':debian:' Erlang/OTP 17 [erts-6.1] [source] [64-bit] [smp:4:4] [async-threads:10] [kernel-poll:false]
Eshell V6.1 (abort with ^G) (dev@127.0.0.1)1>
如何在本地机器上运行观察者并将它们连接到远程节点?
最佳答案
至少有三件事:
- 未正确关闭 TCP 连接
- 节点名称
- 隧道错误
如果你关闭进程,它使用 kill
保持 TCP 连接,它可以进入 TIME_WAIT
状态几分钟:read more
在 ssh -L port:host:hostport
中,您有 2 个组件:
- 第一个是
port
这表示,在我的 local 机器上使用这个端口 host:hostport
意思是:“从remote机器连接到这个主机和端口”,你可以想象,你已经在远程机器上并且你想要连接到第三个
您正在使用 hostname
内部,它在您的本地机器上进行评估并返回 debian
这没有意义,因为可能是 debian
在您的远程机器上没有任何意义。尝试使用:
ssh -fxNR 9001:localhost:9001 target -p 5022 -l user
这应该可以按预期工作,没有关于规范的错误。
Erlang 分布式使用节点名称来定位机器。在您正在调用的本地节点上:
net_adm:ping('nodename@target').
它试图直接联系目标上的 4369 端口而不进行端口转发。
Erlang 分布式设计用于本地可信网络。用端口转发来设置它真的很难。
您可以在远程机器上启动调试节点并连接到您的系统——这应该很容易。如果远程系统有X服务器,你甚至可以转发观察者窗口(ssh -Y
)。
关于ssh - 使用 ssh 端口转发运行 Erlang Observer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26248994/