erlang 實現了 對 ssh 的支持,本文只講述我本身對所理解的ssh 模塊的部分理解,若是錯誤,煩請指出,萬分感謝。算法
使用 ssh 模塊,先要啓動 ssh 功能: ssh:start()。erlang 的 ssh 分爲 client 和 server 兩部分。能夠起一個 erlang 節點用來支持 server,也可使用 Linux 下默認的 22 號端口來支持 server(已經啓動了 sshd 服務)。若是 起一個 erlang 節點做爲 server的話,能夠自定義不少特徵,好比 端口改變,IP地址改變,加解密算法,記錄日誌函數,密鑰,目錄等等。使用 ssh:daemon() 函數進行啓動。不過我沒怎麼研究過這個模式。shell
還能夠 直接鏈接 22 號端口,server 部分由 sshd服務提供。session
client 就用一個 erlang 節點來處理。在A機器上面啓動一個 erlang 節點,當成 ssh 的客戶端,鏈接 B機器的 22 號端口,用來執行 B 機器上面的 shell 命令。A機器的操做步驟以下:ssh
1, ssh:start(). 啓動 ssh 模塊的功能。函數
2,獲取 一個 ssh 鏈接。這個 Ref 指針是用來表示一個 ssh 鏈接的。指針
{ok,Ref}= ssh:connect("192.168.217.135",22,[]).日誌
3,生成一個 ssh_channel_id() 。ssh_channel_id 是一個信道的標識,咱們後面要往這個信道發送shell 命令。下面的 1000 表示 超時時間是 1000 毫秒。server
{ok,ChannelId} = ssh_connection:session_channel(Ref,1000).進程
4,設置 該ssh 鏈接的 該信道 的通訊爲 須要回覆,若是不設置這個,那麼你的 erlang 進程將會一直卡在 執行 shell 命令的那個地方,沒法退出。我的以爲緣由是 該ssh_channel_id 不可用。由於 exec 函數在執行 shell 命令成功以後,將會關閉這個 ssh_channel_id 。io
sh_connection:reply_request(Ref,true,success,ChannelId). 這個設置 返回值的 狀態是 wanted 。要設置成這個纔不會 卡死。
5,執行 遠程命令
ssh_connection:exec(Ref,ChannelId,"/home/start.sh",1000).
須要注意的是,exec 函數執行成功以後,將會關閉 這個ChannelId,此時若是執行 ssh_connection:send_eof(Ref, ChannelId) 來關閉這個ChannelId 將會報錯,因此下次你要調用 exec 函數的時候,記得先 執行 第3 步,生成一個 新的 ssh_channel_id ,而後執行 第4 步,將這個新的 ssh_channel_id 置爲 須要回覆,而後利用該 新的 ssh_channel_id 執行 第5 步。
這裏還殘留了一些問題,好比如何讓 B機器上執行的 腳本的結果返回給 A機器的 erlang 節點,如何在 B機器上面啓動節點處理 ssh server的消息,留待之後再深刻研究。