Запустите Erlang Observer с переадресацией портов ssh

У меня есть удаленный узел Erlang и ПК локального разработчика. Я хочу запустить локальный узел [email protected], запустить наблюдателя, вызвать 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 [email protected] -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 :ложный]

Eshell V6.1 (прервать с помощью ^G) ([email protected])1>

Как запустить наблюдателя на локальном компьютере и подключить его к удаленному узлу?


person John Ostin    schedule 08.10.2014    source источник


Ответы (4)


Есть как минимум три вещи:

  • неправильное закрытие TCP-соединений
  • имена узлов
  • неправильное туннелирование

Если закрыть процесс, удерживающий TCP-соединение с kill, он может перейти в состояние TIME_WAIT на пару минут: подробнее

В ssh -L port:host:hostport у вас есть 2 компонента:

  • первый - port, и он говорит, используйте этот порт на моей локальной машине
  • host:hostport означает: "подключиться к этому хосту и порту с удаленной машины", вы можете представить, что вы уже находитесь на удаленной машине и хотите подключиться к третьей

Вы используете hostname внутри, который оценивается на вашей локальной машине и возвращает debian, и это не имеет смысла, потому что, вероятно, debian ничего не значит на вашей удаленной машине. Попробуйте использовать:

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

Это должно работать, как и ожидалось, без ошибки спецификации.

Распределенный Erlang использует имена узлов для определения местоположения машин. На вашем локальном узле вы звоните:

net_adm:ping('nodename@target').

который пытается напрямую связаться с портом 4369 без переадресации портов.

Распределенный Erlang был разработан для использования в локальных доверенных сетях. Это действительно сложно настроить с переадресацией портов. Вы можете запустить узел отладки на удаленной машине и подключиться к вашей системе — это должно быть легко. Если в удаленной системе есть X-сервер, вы даже можете перенаправить окно наблюдателя (ssh -Y).

person tkowal    schedule 08.10.2014

Сначала найдите удаленный порт:

   $ 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

N.B.: Если сервер использует -sname, вам также необходимо использовать -sname, потому что Erlang™. По той же причине вам также потребуется изменить имя хоста вашей системы, чтобы оно соответствовало целевому хосту.

В обозревателе перейдите в раздел Узлы — Подключить узел и введите [email protected].

Вы также можете получить удаленную оболочку:

$ erl -name [email protected] -setcookie if-server-has-one -remsh [email protected]
person Farshid Ashouri    schedule 31.08.2017

Я попытался автоматизировать тот же подход к переадресации портов ssh и пришел к этому проекту: https://github.com/virtan/ccl

Добавьте sys.config с {ccl, [ {slaves, [ {"ef1", "ef1.somehost.net", use} ]} ]} и запустите приложение ccl, чтобы установить туннель к ef1.somehost.net, а также запустить и подключить удаленный узел.

person Igor Milyakov    schedule 13.12.2014

Ответ @tkowal лучше всего объясняет проблему здесь, но я хочу поделиться тем, как я справляюсь с этой проблемой. Мне часто нравится перенаправлять порты, перечисленные epmd -names, на локальный хост, чтобы я мог легко использовать свои локальные инструменты с графическим интерфейсом для проверки состояния вещей на удаленных узлах. Я написал скрипт автоматической переадресации портов для меня, поэтому Мне не нужно запоминать кучу команд. Его легко использовать:

$ ./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, чтобы вывести список удаленных узлов, которые перенаправляются.

person Stratus3D    schedule 31.08.2017