Go语言实现telnet远程登录
发布时间:2020-12-16 18:15:47 所属栏目:大数据 来源:网络整理
导读:1、目前的linux服务器默认都未安装telnet服务,如需在linux服务器(如CentOS7)上安装telnet服务,可参考: http://www.centoscn.com/image-text/install/2015/0101/4402.html 2、telnet-server默认监听的端口号为23 3、默认情况下,linux不允许root用户以te
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 main import ( "fmt" "infrastructure/log" "net" "strconv" "strings" "time" ) type TelnetClient struct { IP string Port string IsAuthentication bool UserName string Password string } const ( //经过测试,linux下,延时需要大于100ms TIME_DELAY_AFTER_WRITE = 500 //500ms ) func main() { telnetClientObj := new(TelnetClient) telnetClientObj.IP = "17.61.30.111" telnetClientObj.Port = "23" telnetClientObj.IsAuthentication = true telnetClientObj.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.Port conn,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.Port conn,func: Telnet,err) return } defer conn.Close() if false == this.telnetProtocolHandshake(conn) { log.Error("pkg: model,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,method: strings.SplitN,errInfo: Invalid commandn",v) return } switch actSlice[0] { case "r": var n int n,err = strconv.Atoi(actSlice[1]) if nil != err { log.Error("pkg: model,method: strconv.Atoi,err) return } p := make([]byte,n) // p := make([]byte,n) n,err = conn.Read(p[0:]) if nil != err { log.Error("pkg: model,method: conn.Read,err) return } buf = append(buf,p[0:n]...) fmt.Println("read data length:",n) fmt.Println(string(p[0:n]) + "nn") // fmt.Println(buf) case "w": _,err = conn.Write([]byte(actSlice[1] + "n")) if nil != err { log.Error("pkg: model,method: conn.Write,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]byte n,err := conn.Read(buf[0:]) if nil != err { log.Error("pkg: model,func: telnetProtocolHandshake,err) return false } fmt.Println(string(buf[0:n])) fmt.Println((buf[0:n])) buf[1] = 252 buf[4] = 252 buf[7] = 252 buf[10] = 252 fmt.Println((buf[0:n])) n,err = conn.Write(buf[0:n]) if nil != err { log.Error("pkg: model,err) return false } n,err = conn.Read(buf[0:]) if nil != err { log.Error("pkg: model,err) return false } fmt.Println(string(buf[0:n])) fmt.Println((buf[0:n])) buf[1] = 252 buf[4] = 251 buf[7] = 252 buf[10] = 254 buf[13] = 252 fmt.Println((buf[0:n])) n,err) return false } fmt.Println(string(buf[0:n])) fmt.Println((buf[0:n])) buf[1] = 252 buf[4] = 252 fmt.Println((buf[0:n])) n,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,err) return false } time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) n,err) return false } fmt.Println(string(buf[0:n])) n,err = conn.Write([]byte(this.Password + "n")) if nil != err { log.Error("pkg: model,err) return false } fmt.Println(string(buf[0:n])) return true } 对于一些嵌入式设备上telnet-server,如果使用以上方法登录不成功,可考虑采用以下代码实现远程登录:
package main import ( "fmt" "infrastructure/log" "net" "strconv" "strings" "time" ) type TelnetClient struct { IP string Port string IsAuthentication bool UserName string Password string } const ( //经过测试,嵌入式设备下,延时大概需要大于300ms TIME_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,err) return } fmt.Println("wirte:",err) return false } fmt.Println(string(buf[0:n])) return true } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |