Erlang接入远程shell控制台

Erlang Shell JCL作业(JCL )模式

Node_1 添加了-detached选项,启动之后直接在后台运行并没有启动Shell:

erl -setcookie abc -name node_1@192.168.1.123 -detached

Node_2 使用了和Node_1相同的cookie,启动之后进入Erlang Shell界面:

erl -setcookie abc -name node_2@192.168.1.123

在Node_2结点:

Eshell V5.9  (abort with ^G)
(node_2@192.168.1.123)1> node().
'node_2@192.168.1.123'
(node_2@192.168.1.123)2>                %Ctrl + G 进入JCL模式
User switch command
--> h   // 帮助
--> r 'node_1@127.0.0.1'
--> j
  1 {shell,start,[init]}
  2* {'node_1@127.0.0.1',shell,start,[]}
--> c 2

Remsh 模式

说明:

-remsh Node
Starts Erlang with a remote shell connected to Node.

使用:

// 启动节点2,将直接接入节点1控制台
# erl -name 2@127.0.0.1 -setcookie 123456 -remsh 1@127.0.0.1
% 底层的运作机 制和使用 JCL 模式时完全一样,不过初始 shell 是远程而非本地启动的(JCL 还是本地的)。
% ^G 仍然是最安全的退出远程 shell 的方法

SSH Daemon模式

erlang自带了SSH的功能,我们可以很方便的开启SSH服务,对外提供远程 shell服务.SSH的使用需要开启crypto

$ makdir /tmp/ssh
$ ssh-keygen -t rsa -f /tmp/ssh/ssh_host_rsa_key
$ ssh-keygen -t rsa1 -f /tmp/ssh/ssh_host_key
$ ssh-keygen -t dsa -f /tmp/ssh/ssh_host_dsa_key
$ erl

(1@127.0.0.1)1> ssh:start().
ok
(1@127.0.0.1)2> ssh:daemon(8888, [{password, "12345"},
                                  {system_dir, "/tmp/ssh"},
                                  {user_dir, "/home/ferd/.ssh"} ]).
{ok,<0.57.0>}

使用端:

# ssh -p 8888 1@127.0.0.1

管道(pipe)模式

这种方法很少用,每次输出时都调用fsync,如果输出过多时,会有很大的性能损失:

$> run_erl -daemon /tmp/erl_pipe /tmp/erl_log "erl -name 1@127.0.0.1 -setcookie 123456"
% daemon 表示以后台进程运行
% /tmp/erl_pipe是管道文件的名称
% /tmp/erl_log指定了日志保存文件夹

% run_erl会在/tmp/erl_pipe下创建erlang.pipe.1.r erlang.pipe.1.w两个管道文件
% 外部系统可通过该管道文件向节点写入/读取数据

然后使用 to_erl 程序来连接节点:

$> to_erl /tmp/erl_pipe

% 需要注意的当前你是直接通过Unix管道和节点交互的,并不存在中间代理节点(和remsh方式不同)
% 因此在这种情况下使用JCL ^G+q会终止目标节点。如果要退出attach模式而不影响目标节点,使用^D
% run_erl另一个作用是输出重定向
% 上例中将所有输出(包括虚拟机和nif输出)重定向到/tmp/erl_log/erlang.log.*
% 这对多日志渠道(lager,io:format,c,lua等)的混合调试是有所帮助的

% PS:rebar2便通过run_erl实现节点启动,并使用to_erl实现attach命令

erl_call模式

$>/usr/local/lib/erlang/lib/erl_interface-3.7.6/bin/erl_call -s -a 'erlang memory ' -name node_1@192.168.1.123 -c abc

$>/usr/local/lib/erlang/lib/erl_interface-3.7.6/bin/erl_call -e -name node_1@192.168.1.123 -c abc