使用 ssh 端口转发运行 Erlang Observer

Joh*_*tin 3 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
Run Code Online (Sandbox Code Playgroud)

但是当我运行这个脚本时,我收到如下消息:

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

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

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

tko*_*wal 5

至少有三件事:

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

如果关闭进程,与之保持 TCP 连接的进程kill可能会进入TIME_WAIT状态几分钟:阅读更多

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

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

您正在使用hostnameinside,它在本地计算机上进行评估并返回debian,这没有意义,因为debian在远程计算机上可能没有任何意义。尝试使用:

ssh -fxNR 9001:localhost:9001 target -p 5022 -l user
Run Code Online (Sandbox Code Playgroud)

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

Erlang 分布式使用节点名称来定位机器。在您的本地节点上,您正在调用:

net_adm:ping('nodename@target').
Run Code Online (Sandbox Code Playgroud)

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

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