最近由于要实现telnet到交换机,对交换机进行一些操作,写静态路由等。于是研究了一下socket如何操作交换机,发现了利用socket连接交换机进行操作还是挺简单的。(其实不止可以进行telnet,还可以连接任何链接,当然有些需要自己定义协议。我自己也是懂点皮毛,还请大神指教一下)
下面我们来说点干货吧
首先是利用nginx自带的socket模块,通过ip、端口连接,当然交换机的默认端口是23
定义一个sock对象,然后利用这个sock连接到指定的ip,端口
local sock = ngx.socket.tcp()
设定超时时间,这个超时是发送时的超时时间,如果你发送的数据在设定的时间内还没有以'\n'结尾或者缓冲区(行缓冲)还没满就会超时。
sock:settimeout(15000)
local ok,err = sock:connect("你要连接的ip","对应的端口(交换机默认是23)")
如果用过命令行telnet的朋友都知道(这里说的是交换机),当你telnet进去之后就会弹出让你输入账号(当然如果你关闭的认证就不需要),输完用户名输密码。然后就可以进行交换机操作了。
sock:send("test\r\n") -- 账号
sock:send("123456\r\n") -- 密码
下面几句是进入到用户模式,然后创建一个用户
sock:send("sys\r\n")
sock:send("aaa\r\n")
sock:send("local-user test password simple 123456\r\n")
你可以直接这样关闭连接退出,也可以自己发送退出命令退出交换机
sock:close()
值得一说的是
我这里是没有接收它返回的任何数据,你要接收数据可以用sock:receive(参数)这个方法,不过这个方法你要写你接收数据的长度,我看网上说是每个返回的数据都有报文头,里面有写数据的大小是多少,接收报文头传的数据大小是4,不过我这个返回的数据是需要自己解码的。有兴趣的朋友可以自己去试试,你也可以传"*l"进去,表示接收一行的数据,你可以连续接收几行,可以看到有数据返回的。
最后再说一下,用过socket的都知道socket的强大,因为任何连接的底层都是通过socket连接的。你也可以试试用socket连接数据库,我看过了一个别人用socket连接数据库的库,跟我上面连接交换机的差不多,问题是你要怎么输入用户和密码,而且它的密码是要加密后的密码,还有里面涉及到了很多编码的问题。有兴趣的朋友可以去研究一下,或者大家一起交流交流一下经验。