Go语言实现telnet远程登录
来源:互联网 发布:php下载文件代码 编辑:程序博客网 时间:2024/05/21 21:39
1、目前的linux服务器默认都未安装telnet服务,如需在linux服务器(如CentOS7)上安装telnet服务,可参考:
http://www.centoscn.com/image-text/install/2015/0101/4402.html
2、telnet-server默认监听的端口号为23
3、默认情况下,linux不允许root用户以telnet方式登录linux主机
使用Go语言模拟telnet客户端远程登录的代码如下:
package mainimport ("fmt""infrastructure/log""net""strconv""strings""time")type TelnetClient struct {IP stringPort stringIsAuthentication boolUserName stringPassword string}const (//经过测试,linux下,延时需要大于100msTIME_DELAY_AFTER_WRITE = 500 //500ms)func main() {telnetClientObj := new(TelnetClient)telnetClientObj.IP = "17.61.30.111"telnetClientObj.Port = "23"telnetClientObj.IsAuthentication = truetelnetClientObj.UserName = "userOne"telnetClientObj.Password = "123456"//fmt.Println(telnetClientObj.PortIsOpen(5))action := []string{"w_cd /", "r_1024", "w_ls", "r_1024"}telnetClientObj.Telnet(action, 20)}func (this *TelnetClient) PortIsOpen(timeout int) bool {raddr := this.IP + ":" + this.Portconn, err := net.DialTimeout("tcp", raddr, time.Duration(timeout)*time.Second)if nil != err {log.Error("pkg: model, func: PortIsOpen, method: net.DialTimeout, errInfo:", err)return false}defer conn.Close()return true}func (this *TelnetClient) Telnet(action []string, timeout int) (buf []byte, err error) {raddr := this.IP + ":" + this.Portconn, err := net.DialTimeout("tcp", raddr, time.Duration(timeout)*time.Second)if nil != err {log.Error("pkg: model, func: Telnet, method: net.DialTimeout, errInfo:", err)return}defer conn.Close()if false == this.telnetProtocolHandshake(conn) {log.Error("pkg: model, func: Telnet, method: this.telnetProtocolHandshake, errInfo: telnet protocol handshake failed!!!")return}//conn.SetReadDeadline(time.Now().Add(time.Second * 30))for _, v := range action {actSlice := strings.SplitN(v, "_", 2)if 2 > len(actSlice) {log.Error("pkg: model, func: Telnet, method: strings.SplitN, errInfo: Invalid command\n", v)return}switch actSlice[0] {case "r":var n intn, err = strconv.Atoi(actSlice[1])if nil != err {log.Error("pkg: model, func: Telnet, method: strconv.Atoi, errInfo:", err)return}p := make([]byte, n)//p := make([]byte, 0, n)n, err = conn.Read(p[0:])if nil != err {log.Error("pkg: model, func: Telnet, method: conn.Read, errInfo:", err)return}buf = append(buf, p[0:n]...)fmt.Println("read data length:", n)fmt.Println(string(p[0:n]) + "\n\n")//fmt.Println(buf)case "w":_, err = conn.Write([]byte(actSlice[1] + "\n"))if nil != err {log.Error("pkg: model, func: Telnet, method: conn.Write, errInfo:", err)return}//fmt.Println("wirte:", actSlice[1])time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE)}}return}func (this *TelnetClient) telnetProtocolHandshake(conn net.Conn) bool {var buf [4096]byten, err := conn.Read(buf[0:])if nil != err {log.Error("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)return false}fmt.Println(string(buf[0:n]))fmt.Println((buf[0:n]))buf[1] = 252buf[4] = 252buf[7] = 252buf[10] = 252fmt.Println((buf[0:n]))n, err = conn.Write(buf[0:n])if nil != err {log.Error("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err)return false}n, err = conn.Read(buf[0:])if nil != err {log.Error("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)return false}fmt.Println(string(buf[0:n]))fmt.Println((buf[0:n]))buf[1] = 252buf[4] = 251buf[7] = 252buf[10] = 254buf[13] = 252fmt.Println((buf[0:n]))n, err = conn.Write(buf[0:n])if nil != err {log.Error("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err)return false}n, err = conn.Read(buf[0:])if nil != err {log.Error("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)return false}fmt.Println(string(buf[0:n]))fmt.Println((buf[0:n]))buf[1] = 252buf[4] = 252fmt.Println((buf[0:n]))n, err = conn.Write(buf[0:n])if nil != err {log.Error("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err)return false}n, err = conn.Read(buf[0:])if nil != err {log.Error("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)return false}fmt.Println(string(buf[0:n]))fmt.Println((buf[0:n]))if false == this.IsAuthentication {return true}n, err = conn.Write([]byte(this.UserName + "\n"))if nil != err {log.Error("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err)return false}time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE)n, err = conn.Read(buf[0:])if nil != err {log.Error("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)return false}fmt.Println(string(buf[0:n]))n, err = conn.Write([]byte(this.Password + "\n"))if nil != err {log.Error("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err)return false}time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE)n, err = conn.Read(buf[0:])if nil != err {log.Error("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)return false}fmt.Println(string(buf[0:n]))return true}
对于一些嵌入式设备上telnet-server,如果使用以上方法登录不成功,可考虑采用以下代码实现远程登录:
package mainimport ("fmt""infrastructure/log""net""strconv""strings""time")type TelnetClient struct {IP stringPort stringIsAuthentication boolUserName stringPassword string}const (//经过测试,嵌入式设备下,延时大概需要大于300msTIME_DELAY_AFTER_WRITE = 300 //300ms)func main() {telnetClientObj := new(TelnetClient)telnetClientObj.IP = "192.168.5.1"telnetClientObj.Port = "23"telnetClientObj.IsAuthentication = false//telnetClientObj.UserName = "userOne"//telnetClientObj.Password = "xhw888"//fmt.Println(telnetClientObj.PortIsOpen(5))action := []string{"w_/ushell", "r_4096", "w_zte", "r_4096"}telnetClientObj.Telnet(action, 20)}func (this *TelnetClient) PortIsOpen(timeout int) bool {raddr := this.IP + ":" + this.Portconn, err := net.DialTimeout("tcp", raddr, time.Duration(timeout)*time.Second)if nil != err {log.Error("pkg: model, func: PortIsOpen, method: net.DialTimeout, errInfo:", err)return false}defer conn.Close()return true}func (this *TelnetClient) Telnet(action []string, timeout int) (buf []byte, err error) {raddr := this.IP + ":" + this.Portconn, err := net.DialTimeout("tcp", raddr, time.Duration(timeout)*time.Second)if nil != err {log.Error("pkg: model, func: Telnet, method: net.DialTimeout, errInfo:", err)return}defer conn.Close()if false == this.telnetProtocolHandshake(conn) {log.Error("pkg: model, func: Telnet, method: this.telnetProtocolHandshake, errInfo: telnet protocol handshake failed!!!")return}//conn.SetReadDeadline(time.Now().Add(time.Second * 30))for _, v := range action {actSlice := strings.SplitN(v, "_", 2)if 2 > len(actSlice) {log.Error("pkg: model, func: Telnet, method: strings.SplitN, errInfo: Invalid command\n", v)return}switch actSlice[0] {case "r":var n intn, err = strconv.Atoi(actSlice[1])if nil != err {log.Error("pkg: model, func: Telnet, method: strconv.Atoi, errInfo:", err)return}p := make([]byte, n)//p := make([]byte, 0, n)n, err = conn.Read(p[0:])if nil != err {log.Error("pkg: model, func: Telnet, method: conn.Read, errInfo:", err)return}buf = append(buf, p[0:n]...)fmt.Println("read data length:", n)fmt.Println(string(p[0:n]) + "\n\n")//fmt.Println(buf)case "w":_, err = conn.Write([]byte(actSlice[1] + "\n"))if nil != err {log.Error("pkg: model, func: Telnet, method: conn.Write, errInfo:", err)return}fmt.Println("wirte:", actSlice[1])time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE)}}return}func (this *TelnetClient) telnetProtocolHandshake(conn net.Conn) bool {var buf [4096]byten, err := conn.Read(buf[0:])if nil != err {log.Error("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)return false}fmt.Println(string(buf[0:n]))fmt.Println((buf[0:n]))buf[1] = 252buf[4] = 252buf[7] = 252buf[10] = 252fmt.Println((buf[0:n]))n, err = conn.Write(buf[0:n])if nil != err {log.Error("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err)return false}time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE)n, err = conn.Read(buf[0:])if nil != err {log.Error("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)return false}fmt.Println(string(buf[0:n]))fmt.Println((buf[0:n]))buf[1] = 252buf[4] = 251buf[7] = 252buf[10] = 254buf[13] = 252fmt.Println((buf[0:n]))n, err = conn.Write(buf[0:n])if nil != err {log.Error("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err)return false}time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE)n, err = conn.Read(buf[0:])if nil != err {log.Error("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)return false}fmt.Println(string(buf[0:n]))fmt.Println((buf[0:n]))if false == this.IsAuthentication {return true}n, err = conn.Write([]byte(this.UserName + "\n"))if nil != err {log.Error("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err)return false}time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE)n, err = conn.Read(buf[0:])if nil != err {log.Error("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)return false}fmt.Println(string(buf[0:n]))n, err = conn.Write([]byte(this.Password + "\n"))if nil != err {log.Error("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err)return false}time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE)n, err = conn.Read(buf[0:])if nil != err {log.Error("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)return false}fmt.Println(string(buf[0:n]))return true}
0 0
- Go语言实现telnet远程登录
- 使用Python实现Telnet远程登录
- 使用golang实现telnet远程登录
- 使用Python实现Telnet远程登录
- vc++telnet远程登录
- telnet 代理远程登录
- VC++ telnet远程登录
- Telnet远程登录--常用命令
- 远程登录:telnet
- telnet与远程登录
- vc++telnet远程登录
- Telnet远程登录
- telnet远程登录操作
- DOS批处理下操作telnet实现自动远程登录操作
- lanswich交换机远程TELNET登录
- Telnet 和Rlogin:远程登录
- telnet远程登录乱码问题
- telnet远程登录设备时闪退
- gitlab备份与恢复
- UE4流程控制
- 排序算法
- 浅谈ScrollView嵌套ListView及ListView嵌套的高度计算
- 分库分表的几种常见形式以及可能遇到的难题
- Go语言实现telnet远程登录
- jenkins+docker+nodejs项目的自动部署环境(案例)
- android学习(十八) 添加动画(一)淡入淡出的视图
- EL表达式 参考手册
- redis事务
- 微信开发:申请新浪云空间
- PHP实现双端队列
- Delphi容器类之---TList、TStringList、TObjectList,以及一个例程的代码分析
- Neural Network Toolbox 使用笔记1:数据拟合