一、背景
http 和 ftp 可以获取远端 server 的文件。而 telnet 是基于 tcp 的协议,其可以普通用户的特权身份登录 server 并获取其制定 应用或数据的权限。
telnet 请求会以某 userID 登录 server,然后 telnet 程序会提示输入密码,若正确则可登录到 server。
telnet 有以下场景:
- 获取 server 上指定的 应用或数据,只要是用用非加密文本传输的
- 验证 server 的某 port 是否连通,
- ftp 也可利用 telnet 来发送数据。
telnet 是非加密的,因为任何人都可通过 username、password 或其他 private information 登录。
而 ssh 的消息是加密的。
二、rust 实现
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 实现
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)
}