【计算机网络】8、telnet 协议 与 golang、rust 实现

在这里插入图片描述

一、背景

http 和 ftp 可以获取远端 server 的文件。而 telnet 是基于 tcp 的协议,其可以普通用户的特权身份登录 server 并获取其制定 应用或数据的权限。

telnet 请求会以某 userID 登录 server,然后 telnet 程序会提示输入密码,若正确则可登录到 server。

telnet 有以下场景:

  • 获取 server 上指定的 应用或数据,只要是用用非加密文本传输的
  • 验证 server 的某 port 是否连通,
  • ftp 也可利用 telnet 来发送数据。

telnet 是非加密的,因为任何人都可通过 username、password 或其他 private information 登录。

而 ssh 的消息是加密的。

二、rust 实现

telnet-rs

use telnet::{
    
    Telnet, Event};
fn main() {
    
    
    println!("Hello, world!");
    let mut telnet = Telnet::connect(("192.168.100.99", 7000), 256).expect("Could not connect to server...");
    loop {
    
    
        let event = telnet.read().expect("Read error");
        if let Event::Data(buffer) = event {
    
    
            println!("{:?}", buffer)
        }
    }
}

三、go 实现

go-telnet

package services

import (
	"fmt"
	"github.com/pkg/errors"
	"github.com/reiver/go-telnet"
	log "github.com/sirupsen/logrus"
	"configs"
)

type telnetService struct{
    
    }

func TelnetService() *telnetService {
    
    
	return &telnetService{
    
    }
}

func (s *telnetService) Run() {
    
    
	total := len(configs.TelnetHosts())
	log.Infof("start total %v telnet server", total)
	for i, host := range configs.TelnetHosts() {
    
    
		addr := fmt.Sprintf("%v:%v", host, configs.TelnetPort())
		conn, err := telnet.DialTo(addr)
		logStr := fmt.Sprintf("%v/%v server %v", i, total, addr)
		if err != nil {
    
    
			log.Error(errors.WithMessagef(err, logStr))
			continue
		}
		if conn == nil {
    
    
			log.Error(errors.WithMessagef(fmt.Errorf("got empty connection"), logStr))
			continue
		}
		log.Info(logStr, ", ok")
	}
	log.Infof("end total %v telnet server", total)
}

telnet 介绍

猜你喜欢

转载自blog.csdn.net/jiaoyangwm/article/details/130870552
今日推荐