fix: telnet serve enhancement
This commit is contained in:
114
sshsvc/sshsvc.go
114
sshsvc/sshsvc.go
@@ -19,6 +19,7 @@ import (
|
|||||||
"be.ems/sshsvc/config"
|
"be.ems/sshsvc/config"
|
||||||
"be.ems/sshsvc/logmml"
|
"be.ems/sshsvc/logmml"
|
||||||
"be.ems/sshsvc/snmp"
|
"be.ems/sshsvc/snmp"
|
||||||
|
telnetOMC "be.ems/sshsvc/telnet"
|
||||||
|
|
||||||
//"github.com/gliderlabs/ssh"
|
//"github.com/gliderlabs/ssh"
|
||||||
"golang.org/x/crypto/ssh"
|
"golang.org/x/crypto/ssh"
|
||||||
@@ -110,22 +111,34 @@ func main() {
|
|||||||
log.Fatal("Failed to Listen: ", err)
|
log.Fatal("Failed to Listen: ", err)
|
||||||
os.Exit(4)
|
os.Exit(4)
|
||||||
}
|
}
|
||||||
fmt.Printf("MML SSH server startup, listen port:%d\n", conf.Sshd.ListenPort)
|
//fmt.Printf("MML SSH server startup, listen port:%d\n", conf.Sshd.ListenPort)
|
||||||
// 启动telnet服务器
|
// 启动telnet服务器
|
||||||
telnetUri := fmt.Sprintf("%s:%d", conf.TelnetServer.ListenAddr, conf.TelnetServer.ListenPort)
|
//telnetUri := fmt.Sprintf("%s:%d", conf.TelnetServer.ListenAddr, conf.TelnetServer.ListenPort)
|
||||||
// telnetListener, err := net.Listen("tcp", telnetUri)
|
// telnetListener, err := net.Listen("tcp", telnetUri)
|
||||||
// if err != nil {
|
// if err != nil {
|
||||||
// log.Fatal("Failed to Listen: ", err)
|
// log.Fatal("Failed to Listen: ", err)
|
||||||
// os.Exit(4)
|
// os.Exit(4)
|
||||||
// }
|
// }
|
||||||
fmt.Printf("MML Telnet server startup, listen port:%d\n", conf.TelnetServer.ListenPort)
|
//fmt.Printf("MML Telnet server startup, listen port:%d\n", conf.TelnetServer.ListenPort)
|
||||||
// telnetconn, err := telnetListener.Accept()
|
// telnetconn, err := telnetListener.Accept()
|
||||||
// if err != nil {
|
// if err != nil {
|
||||||
// log.Fatal("Failed to accept telnet connection: ", err)
|
// log.Fatal("Failed to accept telnet connection: ", err)
|
||||||
// os.Exit(6)
|
// os.Exit(6)
|
||||||
// }
|
// }
|
||||||
|
|
||||||
go startTelnetServer(telnetUri)
|
telnetSvc := telnetOMC.TelnetHandler{
|
||||||
|
// ListenAddr: conf.TelnetServer.ListenAddr,
|
||||||
|
// ListenPort: conf.TelnetServer.ListenPort,
|
||||||
|
// UserName: conf.TelnetServer.UserName,
|
||||||
|
// Password: conf.TelnetServer.Password,
|
||||||
|
// AuthType: conf.TelnetServer.AuthType,
|
||||||
|
// MaxConnNum: conf.TelnetServer.MaxConnNum,
|
||||||
|
// TagNE: conf.TelnetServer.TagNE,
|
||||||
|
ListenHost: conf.TelnetServer.ListenAddr + ":" + strconv.Itoa(int(conf.TelnetServer.ListenPort)),
|
||||||
|
}
|
||||||
|
// go telnetSvc.StartTelnetServer()
|
||||||
|
go StartTelnetServer(telnetSvc.ListenHost)
|
||||||
|
|
||||||
snmpSvc := snmp.SNMPService{
|
snmpSvc := snmp.SNMPService{
|
||||||
ListenAddr: conf.SNMPServer.ListenAddr,
|
ListenAddr: conf.SNMPServer.ListenAddr,
|
||||||
ListenPort: conf.SNMPServer.ListenPort,
|
ListenPort: conf.SNMPServer.ListenPort,
|
||||||
@@ -183,7 +196,7 @@ func handleAuth(authType, userName, password string) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func startTelnetServer(addr string) {
|
func StartTelnetServer(addr string) {
|
||||||
listener, err := net.Listen("tcp", addr)
|
listener, err := net.Listen("tcp", addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Error starting Telnet server:", err)
|
fmt.Println("Error starting Telnet server:", err)
|
||||||
@@ -202,7 +215,7 @@ func startTelnetServer(addr string) {
|
|||||||
telnetMu.Lock()
|
telnetMu.Lock()
|
||||||
if telnetCC >= int(conf.TelnetServer.MaxConnNum) {
|
if telnetCC >= int(conf.TelnetServer.MaxConnNum) {
|
||||||
telnetMu.Unlock()
|
telnetMu.Unlock()
|
||||||
io.WriteString(conn, "Connection limit reached. Try again later.\n")
|
io.WriteString(conn, "Connection limit reached. Try again later.\r\n")
|
||||||
conn.Close()
|
conn.Close()
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -225,7 +238,7 @@ func handleTelnetConnection(conn net.Conn) {
|
|||||||
writer := bufio.NewWriter(conn)
|
writer := bufio.NewWriter(conn)
|
||||||
|
|
||||||
// 发送欢迎信息
|
// 发送欢迎信息
|
||||||
writer.WriteString("Welcome to the Telnet server!\n")
|
writer.WriteString("Welcome to the Telnet server!\r\n")
|
||||||
writer.Flush()
|
writer.Flush()
|
||||||
|
|
||||||
// 请求用户名
|
// 请求用户名
|
||||||
@@ -266,41 +279,102 @@ func handleTelnetConnection(conn net.Conn) {
|
|||||||
writer.Flush()
|
writer.Flush()
|
||||||
|
|
||||||
if handleAuth(conf.TelnetServer.AuthType, user, pass) {
|
if handleAuth(conf.TelnetServer.AuthType, user, pass) {
|
||||||
writer.WriteString("\nAuthentication successful!\n")
|
writer.WriteString("\r\nAuthentication successful!\r\n")
|
||||||
writer.Flush()
|
writer.Flush()
|
||||||
handleCommands(user, conf.TelnetServer.TagNE, reader, writer)
|
HandleCommands(user, conf.TelnetServer.TagNE, reader, writer)
|
||||||
} else {
|
} else {
|
||||||
writer.WriteString("\nAuthentication failed!\n")
|
writer.WriteString("\r\nAuthentication failed!\r\n")
|
||||||
|
writer.Flush()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理命令输
|
||||||
|
func HandleCommands(user, tag string, reader *bufio.Reader, writer *bufio.Writer) {
|
||||||
|
header := fmt.Sprintf("[%s@%s]> ", user, tag)
|
||||||
|
clearLine := "\033[2K\r" // ANSI 转义序列,用于清除当前行
|
||||||
|
for {
|
||||||
|
var commandBuilder strings.Builder
|
||||||
|
for {
|
||||||
|
b, err := reader.ReadByte()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if b == '\n' || b == '\r' {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if b == '\xff' || b == '\xfe' || b == '\x01' {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if b == 127 { // 处理退格键
|
||||||
|
if commandBuilder.Len() > 0 {
|
||||||
|
// 手动截断字符串
|
||||||
|
command := commandBuilder.String()
|
||||||
|
command = command[:len(command)-1]
|
||||||
|
commandBuilder.Reset()
|
||||||
|
commandBuilder.WriteString(command)
|
||||||
|
writer.WriteString("\b \b") // 回显退格
|
||||||
|
writer.Flush()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 回显用户输入的字符
|
||||||
|
writer.WriteByte(b)
|
||||||
|
writer.Flush()
|
||||||
|
commandBuilder.WriteByte(b)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
command := strings.TrimSpace(commandBuilder.String())
|
||||||
|
|
||||||
|
// 处理其他命令
|
||||||
|
switch command {
|
||||||
|
case "hello":
|
||||||
|
writer.WriteString("\r\nHello, world!\r\n")
|
||||||
|
case "time":
|
||||||
|
writer.WriteString(fmt.Sprintf("\r\nCurrent time: %s\r\n", time.Now().Format(time.RFC1123)))
|
||||||
|
case "exit", "quit":
|
||||||
|
writer.WriteString("\r\nGoodbye!\r\n")
|
||||||
|
writer.Flush()
|
||||||
|
return
|
||||||
|
case "":
|
||||||
|
// case "\n":
|
||||||
|
// case "\r\n":
|
||||||
|
case "\xff\xfe\x01":
|
||||||
|
default:
|
||||||
|
writer.WriteString("\r\nUnknown command\r\n")
|
||||||
|
writer.Flush()
|
||||||
|
}
|
||||||
|
writer.WriteString(clearLine + header)
|
||||||
writer.Flush()
|
writer.Flush()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 处理命令输入
|
// 处理命令输入
|
||||||
func handleCommands(user, tag string, reader *bufio.Reader, writer *bufio.Writer) {
|
func HandleCommandsNew(user, tag string, reader *bufio.Reader, writer *bufio.Writer) {
|
||||||
header := fmt.Sprintf("[%s@%s]> ", user, tag)
|
header := fmt.Sprintf("[%s@%s]> ", user, tag)
|
||||||
|
clearLine := "\033[2K\r" // ANSI 转义序列,用于清除当前行
|
||||||
for {
|
for {
|
||||||
|
writer.WriteString(clearLine + header)
|
||||||
|
writer.Flush()
|
||||||
|
|
||||||
command, err := reader.ReadString('\n')
|
command, err := reader.ReadString('\n')
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
command = strings.TrimSpace(command)
|
command = strings.TrimSpace(command)
|
||||||
// 处理其他命令
|
|
||||||
|
// Handle other commands
|
||||||
switch command {
|
switch command {
|
||||||
case "hello":
|
case "hello":
|
||||||
writer.WriteString("Hello, world!\n")
|
writer.WriteString("\r\nHello, world!\r\n")
|
||||||
case "time":
|
case "time":
|
||||||
writer.WriteString(fmt.Sprintf("Current time: %s\n", time.Now().Format(time.RFC1123)))
|
writer.WriteString(fmt.Sprintf("\r\nCurrent time: %s\r\n", time.Now().Format(time.RFC1123)))
|
||||||
case "exit", "quit":
|
case "exit", "quit":
|
||||||
writer.WriteString("Goodbye!\n")
|
writer.WriteString("\r\nGoodbye!\r\n")
|
||||||
writer.Flush()
|
writer.Flush()
|
||||||
return
|
return
|
||||||
case "":
|
|
||||||
case "\n":
|
|
||||||
case "\xff\xfe\x01":
|
|
||||||
default:
|
default:
|
||||||
writer.WriteString("Unknown command\n")
|
writer.WriteString("\r\nUnknown command\r\n")
|
||||||
}
|
}
|
||||||
writer.WriteString(header)
|
|
||||||
writer.Flush()
|
writer.Flush()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user