update: support telnet server
This commit is contained in:
@@ -24,27 +24,27 @@ logmml:
|
|||||||
# authType: local/omc
|
# authType: local/omc
|
||||||
sshd:
|
sshd:
|
||||||
listenAddr: 0.0.0.0
|
listenAddr: 0.0.0.0
|
||||||
listenPort: 2222
|
listenPort: 32222
|
||||||
privateKey: ./.ssh/id_rsa
|
privateKey: ./.ssh/id_rsa
|
||||||
maxConnNum: 2
|
maxConnNum: 2
|
||||||
timeout: 1800
|
timeout: 1800
|
||||||
session: multiple
|
session: multiple
|
||||||
mmlHome: ./mmlhome
|
mmlHome: ./mmlhome
|
||||||
userName: manager
|
userName: manager
|
||||||
password: admin123
|
password: pass123
|
||||||
authType: local
|
authType: local
|
||||||
omcUrl:
|
omcUrl:
|
||||||
|
|
||||||
# authType: local/omc
|
# authType: local/omc
|
||||||
telnetServer:
|
telnetServer:
|
||||||
listenAddr: 0.0.0.0
|
listenAddr: 0.0.0.0
|
||||||
listenPort: 2323
|
listenPort: 32323
|
||||||
maxConnNum: 2
|
maxConnNum: 2
|
||||||
timeout: 1800
|
timeout: 1800
|
||||||
session: multiple
|
session: multiple
|
||||||
mmlHome: ./mmlhome
|
mmlHome: ./mmlhome
|
||||||
userName: manager
|
userName: manager
|
||||||
password: admin123
|
password: pass123
|
||||||
authType: local
|
authType: local
|
||||||
omcUrl:
|
omcUrl:
|
||||||
|
|
||||||
|
|||||||
112
sshsvc/sshsvc.go
112
sshsvc/sshsvc.go
@@ -1,6 +1,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
@@ -8,6 +9,7 @@ import (
|
|||||||
"os/exec"
|
"os/exec"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
"be.ems/lib/dborm"
|
"be.ems/lib/dborm"
|
||||||
"be.ems/lib/global"
|
"be.ems/lib/global"
|
||||||
@@ -23,6 +25,13 @@ import (
|
|||||||
|
|
||||||
var conf *config.YamlConfig
|
var conf *config.YamlConfig
|
||||||
|
|
||||||
|
var (
|
||||||
|
telnetCC int
|
||||||
|
sshCC int
|
||||||
|
telnetMu sync.Mutex
|
||||||
|
sshMu sync.Mutex
|
||||||
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
conf = config.GetYamlConfig()
|
conf = config.GetYamlConfig()
|
||||||
log.InitLogger(conf.Logger.File, conf.Logger.Duration, conf.Logger.Count, "omc:sshsvc", config.GetLogLevel())
|
log.InitLogger(conf.Logger.File, conf.Logger.Duration, conf.Logger.Count, "omc:sshsvc", config.GetLogLevel())
|
||||||
@@ -142,20 +151,6 @@ func handleAuth(authType, userName, password string) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// const (
|
|
||||||
// // 定义用户名和密码
|
|
||||||
// validUsername = "user"
|
|
||||||
// validPassword = "password"
|
|
||||||
// maxConnections = 5
|
|
||||||
// )
|
|
||||||
|
|
||||||
var (
|
|
||||||
telnetCC int
|
|
||||||
sshCC int
|
|
||||||
telnetMu sync.Mutex
|
|
||||||
sshMu sync.Mutex
|
|
||||||
)
|
|
||||||
|
|
||||||
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 {
|
||||||
@@ -193,21 +188,88 @@ func handleTelnetConnection(conn net.Conn) {
|
|||||||
telnetMu.Unlock()
|
telnetMu.Unlock()
|
||||||
}()
|
}()
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
io.WriteString(conn, "Welcome to the Telnet server!\n")
|
|
||||||
io.WriteString(conn, "Please enter username: ")
|
|
||||||
|
|
||||||
var username string
|
reader := bufio.NewReader(conn)
|
||||||
fmt.Fscanln(conn, &username)
|
writer := bufio.NewWriter(conn)
|
||||||
|
|
||||||
io.WriteString(conn, "Please enter password: ")
|
// 发送欢迎信息
|
||||||
var password string
|
writer.WriteString("Welcome to the Telnet server!\n")
|
||||||
fmt.Fscanln(conn, &password)
|
writer.Flush()
|
||||||
|
|
||||||
if handleAuth(conf.TelnetServer.AuthType, username, password) {
|
// 请求用户名
|
||||||
io.WriteString(conn, "Login successful!\n")
|
writer.WriteString("Username: ")
|
||||||
io.Copy(conn, conn) // Echo back whatever is received
|
writer.Flush()
|
||||||
|
user, _ := reader.ReadString('\n')
|
||||||
|
user = strings.TrimSpace(user)
|
||||||
|
|
||||||
|
// 关闭回显模式
|
||||||
|
writer.Write([]byte{255, 251, 1}) // IAC WILL ECHO
|
||||||
|
writer.Flush()
|
||||||
|
|
||||||
|
// 请求密码
|
||||||
|
writer.WriteString("Password: ")
|
||||||
|
writer.Flush()
|
||||||
|
|
||||||
|
// 读取密码并清除控制序列
|
||||||
|
var passBuilder strings.Builder
|
||||||
|
for {
|
||||||
|
b, err := reader.ReadByte()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if b == '\n' || b == '\r' {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if b == 255 { // IAC
|
||||||
|
reader.ReadByte() // 忽略下一个字节
|
||||||
|
reader.ReadByte() // 忽略下一个字节
|
||||||
|
} else {
|
||||||
|
passBuilder.WriteByte(b)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pass := passBuilder.String()
|
||||||
|
|
||||||
|
// 恢复回显模式
|
||||||
|
writer.Write([]byte{255, 252, 1}) // IAC WONT ECHO
|
||||||
|
writer.Flush()
|
||||||
|
|
||||||
|
if handleAuth(conf.TelnetServer.AuthType, user, pass) {
|
||||||
|
writer.WriteString("\nAuthentication successful!\n")
|
||||||
|
writer.Flush()
|
||||||
|
handleCommands(user, reader, writer)
|
||||||
} else {
|
} else {
|
||||||
io.WriteString(conn, "Login failed!\n")
|
writer.WriteString("\nAuthentication failed!\n")
|
||||||
|
writer.Flush()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理命令输入
|
||||||
|
func handleCommands(user string, reader *bufio.Reader, writer *bufio.Writer) {
|
||||||
|
header := fmt.Sprintf("[%s@omc]> ", user)
|
||||||
|
for {
|
||||||
|
command, err := reader.ReadString('\n')
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
command = strings.TrimSpace(command)
|
||||||
|
// 处理其他命令
|
||||||
|
switch command {
|
||||||
|
case "hello":
|
||||||
|
writer.WriteString("Hello, world!\n")
|
||||||
|
case "time":
|
||||||
|
writer.WriteString(fmt.Sprintf("Current time: %s\n", time.Now().Format(time.RFC1123)))
|
||||||
|
case "exit", "quit":
|
||||||
|
writer.WriteString("Goodbye!\n")
|
||||||
|
writer.Flush()
|
||||||
|
return
|
||||||
|
case "":
|
||||||
|
case "\n":
|
||||||
|
case "\xff\xfe\x01":
|
||||||
|
default:
|
||||||
|
writer.WriteString("Unknown command\n")
|
||||||
|
}
|
||||||
|
writer.WriteString(header)
|
||||||
|
writer.Flush()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user