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主机
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 command\n",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]) + "\n\n") // 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 }