加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读