最近由于要實現(xiàn)telnet到交換機(jī)撑蒜,對交換機(jī)進(jìn)行一些操作,寫靜態(tài)路由等。于是研究了一下socket如何操作交換機(jī)旁涤,發(fā)現(xiàn)了利用socket連接交換機(jī)進(jìn)行操作還是挺簡單的翔曲。(其實不止可以進(jìn)行telnet,還可以連接任何鏈接劈愚,當(dāng)然有些需要自己定義協(xié)議瞳遍。我自己也是懂點皮毛,還請大神指教一下)
下面我們來說點干貨吧
首先是利用nginx自帶的socket模塊菌羽,通過ip掠械、端口連接,當(dāng)然交換機(jī)的默認(rèn)端口是23
定義一個sock對象注祖,然后利用這個sock連接到指定的ip份蝴,端口
local sock = ngx.socket.tcp()
設(shè)定超時時間,這個超時是發(fā)送時的超時時間氓轰,如果你發(fā)送的數(shù)據(jù)在設(shè)定的時間內(nèi)還沒有以'\n'結(jié)尾或者緩沖區(qū)(行緩沖)還沒滿就會超時婚夫。
sock:settimeout(15000)
local ok,err = sock:connect("你要連接的ip","對應(yīng)的端口(交換機(jī)默認(rèn)是23)")
如果用過命令行telnet的朋友都知道(這里說的是交換機(jī)),當(dāng)你telnet進(jìn)去之后就會彈出讓你輸入賬號(當(dāng)然如果你關(guān)閉的認(rèn)證就不需要)署鸡,輸完用戶名輸密碼案糙。然后就可以進(jìn)行交換機(jī)操作了。
sock:send("test\r\n") -- 賬號
sock:send("123456\r\n") -- 密碼
下面幾句是進(jìn)入到用戶模式靴庆,然后創(chuàng)建一個用戶
sock:send("sys\r\n")
sock:send("aaa\r\n")
sock:send("local-user test password simple 123456\r\n")
你可以直接這樣關(guān)閉連接退出时捌,也可以自己發(fā)送退出命令退出交換機(jī)
sock:close()
值得一說的是
我這里是沒有接收它返回的任何數(shù)據(jù),你要接收數(shù)據(jù)可以用sock:receive(參數(shù))這個方法炉抒,不過這個方法你要寫你接收數(shù)據(jù)的長度奢讨,我看網(wǎng)上說是每個返回的數(shù)據(jù)都有報文頭,里面有寫數(shù)據(jù)的大小是多少焰薄,接收報文頭傳的數(shù)據(jù)大小是4拿诸,不過我這個返回的數(shù)據(jù)是需要自己解碼的。有興趣的朋友可以自己去試試塞茅,你也可以傳"*l"進(jìn)去亩码,表示接收一行的數(shù)據(jù),你可以連續(xù)接收幾行野瘦,可以看到有數(shù)據(jù)返回的描沟。
最后再說一下,用過socket的都知道socket的強(qiáng)大鞭光,因為任何連接的底層都是通過socket連接的吏廉。你也可以試試用socket連接數(shù)據(jù)庫,我看過了一個別人用socket連接數(shù)據(jù)庫的庫惰许,跟我上面連接交換機(jī)的差不多席覆,問題是你要怎么輸入用戶和密碼,而且它的密碼是要加密后的密碼啡省,還有里面涉及到了很多編碼的問題娜睛。有興趣的朋友可以去研究一下髓霞,或者大家一起交流交流一下經(jīng)驗。