erlang 接入遠端shell控制台

2021-09-02 09:52:20 字數 4492 閱讀 6517

erlang shell是使用者與 erlang 執行時系統互動的介面程式。事實上,erlang vm的執行不依賴任何shell,只要在啟動的時候新增引數detached就可以脫離終端。 -

detached

starts the erlang runtime system detached from the system console. useful for running daemons and backgrounds processes. implies -noinput.

實際上,detached等效於noshell 加上 noinput。

# erl -detached-emu_args

executing: /home/erl/lib/erlang/erts-5.10.3/bin/beam /home/erl/lib/erlang/erts-5.10.3/bin/beam -- -root /home/erl/lib/erlang -progname erl -- -home /root ---noshell -noinput

另外,需要注意的是,windows不直接支援detached,而是以服務的形式在後台執行,見

erlsrv

現在討論erlang 接入遠端shell控制台的幾種方式。

在 erlangshell 中按下^g鍵,就可以看到作業控制模式(jclmode)的選單。在選單中,有

個選項能讓我們連線到乙個遠端 shell。

先以detached執行乙個節點1:

# erl -name[email protected]-setcookie 123456 -detached

檢查這個erlang程序是否執行

# ps -ef | grep beam

root 20672 1 0 01:32 ? 00:00:00 /home/erl/lib/erlang/erts-5.10.3/bin/beam -- -root /home/erl/lib/erlang -progname erl -- -home /root -- -name

[email protected]

-setcookie 123456 -noshell -noinput

啟動另外乙個節點2,並接入到節點1

# erl -name[email protected]-setcookie 123456

erlang r16b02 (erts-5.10.3) [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]

eshell v5.10.3 (abort with ^g)

([email protected])1>

user switch command

--> h

c [nn] - connect to job

i [nn] - interrupt job

k [nn] - kill job

j - list all jobs

s [shell] - start local shell

r [node [shell]] - start remote shell

q - quit erlang

? | h - this message

--> r '[email protected]'

--> j

1

2*

--> c 2

eshell v5.10.3 (abort with ^g)

([email protected])1>

注意了,windows下要使用werl

連線到遠端 shell 後,所有的終端輸入解析操作都由本地 shell 完成,不過求值的工作是在遠

程完成的。遠端求值的結果輸出全部被**給本地 shell。

要退出 shell, 按^g回到 jcl 模式。

終端輸入解析操作是在本地進行的, 因此通過^gq 的方式退出 shell

是安全的。

eshell v5.10.3 (abort with ^g) (

[email protected])1>

user switch command

--> q

remsh和 jcl 模式很類似,但是呼叫方式不同的機制。使用這種機制,jcl 模式的所有

操作步驟都可以被繞過,只需像下面這樣啟動 shell,對於長名字:

-remshnode

starts erlang with a remote shell connected to node.

以下方式啟動節點2,將直接接入節點1控制台:

# erl -name[email protected]-setcookie 123456-remsh[email protected]

erlang r16b02 (erts-5.10.3) [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]

eshell v5.10.3 (abort with ^g)

([email protected])1> node().

'[email protected]'

這種方式和jcl很相像,本地也會啟動乙個erlang節點用於接入遠端shell

erlang自帶了

ssh的功能,我們可以很方便的開啟ssh服務

,對外提供遠端 shell服務。 ssh的使用需要開啟crypto,如果erlang顯示以下錯誤,可以參考這篇文章。

1> crypto:start().

** exception error: undefined function crypto:start/0

要使用該功能,通常需要先準備好具有遠端訪問 ssh 許可權的 key,不過這裡為了快速

測試,可以這樣做:

節點1啟動ssh服務:

eshell v5.10.3 (abort with ^g)

([email protected])1> ssh:start().

ok

([email protected])2> ssh:daemon(8888, ).

本地不需要啟動erlang節點,直接使用ssh連線即可,輸入以上設定的密碼,就可以接入節點1的shell控制台。

# ssh -p 8888[email protected]

the authenticity of host '[127.0.0.1]:8888 ([127.0.0.1]:8888)' can't be established.

rsa key fingerprint is ad:03:b4:6b:df:51:97:23:dc:47:cb:75:85:15:44:89.

are you sure you want to continue connecting (yes/no)?

yes

warning: permanently added '[127.0.0.1]:8888' (rsa) to the list of known hosts.

[email protected]'s password:

eshell v5.10.3 (abort with ^g)

([email protected])1>

這種方式,erlang

shell所有操作都是在遠端節點完成的。

在使用管道(pipe)連線到乙個erlang節點時,和ssh一樣不需要啟動本地erlang節點

。這種方法很少用,每次輸出時都呼叫fsync,如果輸出過多時,會有很大的效能損失。

具體做法為:用run_erl啟動 erlang,相當於把 erlang 程序包在乙個

管道中:

# mkdir /tmp/erl_log

# cd /home/erl/bin

# ./run_erl -daemon /tmp/erl_pipe /tmp/erl_log "erl -name[email protected]-setcookie 123456"

其中,daemon 表示以後臺程序執行,/tmp/erl_pipe是管道檔案的名稱,/tmp/erl_log指定了日誌儲存資料夾

然後使用 to_erl 程式來連線節點:

# ./to_erl /tmp/erl_pipe

attaching to /tmp/erl_pipe (^d to exit)

([email protected])1> node(). '

[email protected]'

參考:

erlang接入遠端shell

兩種方式 erl name aaa 127.0.0.1 setcookie 111 erl name bbb 127.0.0.1 setcookie 111 ctrl g進入jcl模式 h檢視幫助r aaa 127.0.0.1 j檢視job列表 c 2進入遠端shell 如果返回,則重新ctrl g...

erlang遠端呼叫示例

下面的例子試用了erlang的分布式程式設計,從中可以看出像erlang這種基於訊息的純函式語言在分布式程式設計中的強大威力.在遠端節點編寫乙個測試的模組 module distribution export a 0 a hello.首先啟動遠端節點,並設定cookie,載入模組 erl name ...

遠端接入 原始碼

通過終端服務,可以很容易的用c delphi c pb 等開發工具,開發出自己的遠端接入系統。類似瑞友天翼等遠端接入軟體的效果 呼叫說明 下面截圖說明利用此遠端接入元件開發的b s結構的遠端接入系統 輸入遠端伺服器分配的賬號,登入系統 支援域賬號登入 顯示遠端伺服器已發布的應用程式清單 開啟遠端應用...