【原创】使用golang访问windows telnet服务器
本篇博客记录本次使用golang语言tcp方式进行telnet服务器访问
环境:
1、win7系统telnet服务器,使用地址:192.168.8.189
2、python使用telnetlib库对telnet服务器进行访问的客户端例程
3、服务端用户名:admin 密码:123456
本次功能实现过程:
第一步:抓包获取telnet交互流程分析
1、打开cmd。输入:telnet 192.168.8.189 访问 telnet服务器,依次输入用户名密码,登录成功后输入:exit 退出;
2、打开wireshark对上述流程进行抓包;
流查看抓包内容如下:

转储16进制查看:

内容分析结果:
1、回车换行内容为:0d 0a 也就是window本身的换行:\r\n;
2、回显内容包含大量屏幕坐标信息,基本无法直接使用;
看到该内容后想起以前使用python进行telnet服务器访问时,回显内容无屏幕坐标信息,遂找出以前写的python程序对访问信息进行抓包查看:
第二步:用使用telnetlib库编写的python程序对服务器进行访问,对交互流程抓包

转储16进制:

查看内容发现回显内容无屏幕坐标信息,对比两次交互内容,决定使用golang对方式二进行模拟,注意图中红色框内信息;
golang程序例程:
第一步:创建连接
func telnet_Creat(host string,usr string,pass string) (conn net.Conn, err error) {
telnetClientObj := new(TelnetClient)
telnetClientObj.IP = host
telnetClientObj.Port = ""
telnetClientObj.IsAuthentication = true
telnetClientObj.UserName = usr
telnetClientObj.Password = pass
conn,err =telnetClientObj.Telnet()
return conn,err
}
func (this *TelnetClient) Telnet(timeout int) (conn net.Conn, err error) {
raddr := this.IP + ":" + this.Port
conn, err = net.DialTimeout("tcp", raddr, time.Duration(timeout)*time.Second)
if nil != err {
log.Print("pkg: model, func: Telnet, method: net.DialTimeout, errInfo:", err)
return
}
if false == this.telnetProtocolHandshake(conn) {
log.Print("pkg: model, func: Telnet, method: this.telnetProtocolHandshake, errInfo: telnet protocol handshake failed!!!")
return
}
return
}
第二步:模拟登录(telnetProtocolHandshake)
func (this *TelnetClient) telnetProtocolHandshake(conn net.Conn) bool {
var buf []byte
log.Print("telnetProtocolHandshake")
n, err := conn.Read(buf[:])
if nil != err {
log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)
return false
}
log.Print("1====",string(buf[:n]))
log.Printf("%x",(buf[:n]))
buf[] = 0xff
buf[] = 0xfc
buf[] = 0x25
buf[] = 0xff
buf[] = 0xfe
buf[] = 0x01
n, err = conn.Write(buf[:])
if nil != err {
log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err)
return false
}
n, err = conn.Read(buf[:])
if nil != err {
log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)
return false
}
log.Print("2====",string(buf[:n]))
buf[] = 0xff
buf[] = 0xfe
buf[] = 0x03
buf[] = 0xff
buf[] = 0xfc
buf[] = 0x27
n, err = conn.Write(buf[:])
if nil != err {
log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err)
return false
}
n, err = conn.Read(buf[:])
if nil != err {
log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)
return false
}
log.Print("3====",string(buf[:n]))
n, err = conn.Write([]byte(this.UserName + "\r\n"))
if nil != err {
log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err)
return false
}
time.Sleep(time.Millisecond * )
n, err = conn.Read(buf[:])
if nil != err {
log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)
return false
}
log.Print("4====",string(buf[:n]))
n, err = conn.Write([]byte(this.Password+ "\r\n"))
if nil != err {
log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err)
return false
}
time.Sleep(time.Millisecond * )
n, err = conn.Read(buf[:])
if nil != err {
log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)
return false
}
log.Print("5====",string(buf[:n]))
buf[] = 0xff
buf[] = 0xfc
buf[] = 0x18
n, err = conn.Write(buf[:])
if nil != err {
log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err)
return false
}
n, err = conn.Read(buf[:])
if nil != err {
log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)
return false
}
log.Print("6====",string(buf[:n]))
return true
}
完整程序:
package tool import (
"log"
"net"
"time"
) type TelnetClient struct {
IP string
Port string
IsAuthentication bool
UserName string
Password string
} func main() {
conn,err:= telnet_Creat(host,usr,pass)
if nil != err {
return err }
defer conn.Close()
//后续对conn进行操作即可
}
func telnet_Creat(host string,usr string,pass string) (conn net.Conn, err error) {
telnetClientObj := new(TelnetClient)
telnetClientObj.IP = host
telnetClientObj.Port = "23"
telnetClientObj.IsAuthentication = true
telnetClientObj.UserName = usr
telnetClientObj.Password = pass
conn,err =telnetClientObj.Telnet(20)
return conn,err
}
func (this *TelnetClient) Telnet(timeout int) (conn net.Conn, err error) {
raddr := this.IP + ":" + this.Port
conn, err = net.DialTimeout("tcp", raddr, time.Duration(timeout)*time.Second)
if nil != err {
log.Print("pkg: model, func: Telnet, method: net.DialTimeout, errInfo:", err)
return
}
if false == this.telnetProtocolHandshake(conn) {
log.Print("pkg: model, func: Telnet, method: this.telnetProtocolHandshake, errInfo: telnet protocol handshake failed!!!")
return
}
return
}
func (this *TelnetClient) telnetProtocolHandshake(conn net.Conn) bool {
var buf [4096]byte
log.Print("telnetProtocolHandshake")
n, err := conn.Read(buf[0:])
if nil != err {
log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)
return false
}
log.Print("1====",string(buf[0:n]))
log.Printf("%x",(buf[0:n]))
buf[0] = 0xff
buf[1] = 0xfc
buf[2] = 0x25
buf[3] = 0xff
buf[4] = 0xfe
buf[5] = 0x01
n, err = conn.Write(buf[0:6])
if nil != err {
log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err)
return false
}
n, err = conn.Read(buf[0:])
if nil != err {
log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)
return false
}
log.Print("2====",string(buf[0:n]))
buf[0] = 0xff
buf[1] = 0xfe
buf[2] = 0x03
buf[3] = 0xff
buf[4] = 0xfc
buf[5] = 0x27
n, err = conn.Write(buf[0:6])
if nil != err {
log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err)
return false
}
n, err = conn.Read(buf[0:])
if nil != err {
log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)
return false
}
log.Print("3====",string(buf[0:n]))
n, err = conn.Write([]byte(this.UserName + "\r\n"))
if nil != err {
log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err)
return false
}
time.Sleep(time.Millisecond * 500)
n, err = conn.Read(buf[0:])
if nil != err {
log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)
return false
}
log.Print("4====",string(buf[0:n]))
n, err = conn.Write([]byte(this.Password+ "\r\n"))
if nil != err {
log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err)
return false
}
time.Sleep(time.Millisecond * 2000)
n, err = conn.Read(buf[0:])
if nil != err {
log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)
return false
}
log.Print("5====",string(buf[0:n]))
buf[0] = 0xff
buf[1] = 0xfc
buf[2] = 0x18
n, err = conn.Write(buf[0:3])
if nil != err {
log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err)
return false
}
n, err = conn.Read(buf[0:])
if nil != err {
log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)
return false
}
log.Print("6====",string(buf[0:n]))
return true
}
如有问题可添加VX :d11235812 一起学习交流;
【原创】使用golang访问windows telnet服务器的更多相关文章
- 客户端访问windows server2016 服务器共享 速度慢
客户端(windows10)敲完地址后,要过很久才会谈出窗口. 所有的客户端都出现过此现象. 解决:关闭server的 Smb1.0
- centos7下安装openvpn,访问内网服务器 (二) windows访问
一.简介 在上一章中已经安装好了openvpn,并且已经启动成功,现在就可以通过openvpn的客户端进行连接访问内网服务器了. 二.安装openvpn客户端 下载地址: https://www.te ...
- 使用VNC+SSH建立安全的远程桌面访问WINDOWS服务器
用了一段时间的MONO,现在MONO也支持了ENTITY FRAMEWORK 6.但是实际上在LINUX环境里用MYSQL还是会有很多坑.并且之前在网络游戏服务端SCUT上扩展一些功能时候也遇到了一些 ...
- 【RL-TCPnet网络教程】第32章 RL-TCPnet之Telnet服务器
第32章 RL-TCPnet之Telnet服务器 本章节为大家讲解RL-TCPnet的Telnet应用,学习本章节前,务必要优先学习第31章的Telnet基础知识.有了这些基础知识之后,再搞 ...
- 使用外网访问阿里云服务器ZooKeeper
参考网址: zookeeper单机/集群安装详解 使用外网访问阿里云服务器ZooKeeper 阿里云服务管理控制台 1. 阿里云ECS安装zookeeper 环境:我安装的是zookeeper3.4. ...
- Linux使用笔记: 使用Samba访问windows的共享目录(转载)
转自:http://easwy.com/blog/archives/mount-a-windows-shared-folder-on-linux-with-samba/ 通常我们使用Samba都是在W ...
- 允许外部访问Windows本机的指定端口
背景:目前公司有一台公网Windows服务器,有公网IP和内网IP,防火墙已开启 需求:9999端口需要对外开放 方案:在防火墙的入站规则里添加一条规则,使外部能够访问9999端口 问题:添加好规则后 ...
- Mac OS X 访问 Windows 共享文件夹
Mac OS X 访问 Windows 共享文件夹 mac没有网络邻居,但可以使用finder访问局域网中windows共享的文件 1.点击 Finder 前往菜单中的「前往服务器」(或快捷键 com ...
- telnet时显示:允许更多到 telnet 服务器的连接。请稍候再试
telnet时显示:允许更多到 telnet 服务器的连接.请稍候再试 解决办法: windows自带telnet服务器默认的最大连接数为2,要想修改该设置,可以在命令行键入tlntadmn c ...
随机推荐
- 用pyspider爬取并解析json字符串
获取堆糖网站所有用户的id 昵称及主页地址 #!/usr/bin/env python # -*- encoding: utf-8 -*- # Created on 2016-06-21 13:57: ...
- 汇总java生态圈常用技术框架、开源中间件,系统架构及经典案例等
转自:http://www.51testing.com/html/83/n-3718883.html 有人认为编程是一门技术活,要有一定的天赋,非天资聪慧者不能及也.非也,这是近几年,对于技术这碗饭有 ...
- 使用IDEA进行版本控制
1.使用IDEA进行版本控制 创建git repository add-添加到暂存区 commit-提交到本地库 push-推送指定远程库(自己的) idea上的pull指的是合并(merge),并非 ...
- 浮点数运算结果不精确,以及用String来构造BigDecimal进行浮点数精确计算
1.浮点数运算结果不精确 先看如下代码 System.out.println(1.0 - 0.8); System.out.println(0.2 + 0.1); System.out.println ...
- kubernetes CSI 插件机制学习笔记
前言 最近在极客时间订阅了kubernetes的专栏,这篇文章是想记录一下自己学习 CSI 插件机制 (container-storage-interface) 的过程,加深一下记忆. 准备工作 老师 ...
- idea jetty 配置
一.jetty 网址下载地:https://www.eclipse.org/jetty/ 1.如下图红色箭头--> 点击Downloads 下载 2.选择最新版 .ZIP 下载 3.选择安装路径 ...
- jenkins:一个jenkins项目远程触发另一个jenkins项目构建配置
很多时候,我们会有这样的应用场景:一个jenkins上的项目构建后,需要远程触发另一台机子上的jenkins中某个项目的构建,可以通过Parameterized Remote Trigger Conf ...
- 脑残式网络编程入门(三):HTTP协议必知必会的一些知识
本文原作者:“竹千代”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.前言 无论是即时通讯应用还是传统的信息系统,Http协议都是我们最常打交 ...
- MySQL InnoDB 行记录格式(ROW_FORMAT)
MySQL InnoDB 行记录格式(ROW_FORMAT) 一.行记录格式的分类和介绍 在早期的InnoDB版本中,由于文件格式只有一种,因此不需要为此文件格式命名.随着InnoDB引擎的发展,开发 ...
- Cannot load php5apache2_4.dll into server
配置PHP开发环境的时候,当进行到在Apache的httpd.conf文件中配置加载PHP模块时发生如下错误 httpd: Syntax error on line 185 of D:/wamp/Ap ...