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