每次啟動一個 BEAM vm 時,他會產生一個隨機的密碼存在家目錄的 .erlang.cookie
檔案 (~/.erlang.cookie
)
我們可以使用 Node.get_cookie/0
在程式中取得 cookie
iex(node2@localhost)2> Node.get_cookie()
:SUQNVNWGTKYLKOAQEELH
如果另一個 node 在同一台機器啟動時,則會沿用這個 cookie,但是不同機器的 node 產生的 cookie 會不同
在我們使用 Node.connect
時會檢查 cookie , cookie 不同就不能建立連線。
讓兩台機器都用同一個 cookie 其中一個方法是使用 Node.set_cookie/2
來設定這個 BEAM 執行的 cookie
目前在同台機器可以用 Node.set_cookie 來改變目前 node 的 cookie
# node 2
iex(node2@localhost)3> Node.set_cookie(:new_cookie)
true
iex(node2@localhost)4> Node.connect(:node1@localhost)
false
會發現不能連線了
# node 1
iex(node1@localhost)5> Node.get_cookie()
:SUQNVNWGTKYLKOAQEELH
12:17:52.158 [error] ** Connection attempt from node :node2@localhost rejected. Invalid challenge reply. **
在 node 1 這邊則是會得到嘗試連線的警告
# node 1
iex(node1@localhost)7> Node.set_cookie(:new_cookie)
true
# node 2
iex(node2@localhost)5> Node.connect(:node1@localhost)
true
iex(node2@localhost)6> Node.list
[:node1@localhost]
當我們把 node 1 的 cookie 也改成跟 node 2 一樣後,就可以正常連線成功了
也可以在 iex 啟動時使用 --cookie
選項指定 cookie
iex --sname node1@localhost --cookie another_cookie