package main import ( "fmt" "net" "github.com/magiconair/properties" "golang.org/x/crypto/ssh" ) func main() { // 解析 server.properties conf := properties.MustLoadFile("server.properties", properties.UTF8) var SSH_SERVER struct { Host string Port string User string Pass string config *ssh.ServerConfig } SSH_SERVER.Host = conf.MustGetString("server-ip") SSH_SERVER.Port = conf.MustGetString("server-port") SSH_SERVER.User = conf.MustGetString("term-user") SSH_SERVER.Pass = conf.MustGetString("term-pass") // 创建 ssh 密码认证 SSH_SERVER.config = &ssh.ServerConfig{ PasswordCallback: func(conn ssh.ConnMetadata, password []byte) (*ssh.Permissions, error) { if conn.User() == SSH_SERVER.User && string(password) == SSH_SERVER.Pass { return nil, nil } return nil, ssh.ErrNoAuth }, } // 创建 ssh 服务器密钥 privateKeySigner, err := ssh.ParsePrivateKey(privatePEM) if err != nil { panic(fmt.Errorf("不能解析私钥: %v", err)) } SSH_SERVER.config.AddHostKey(privateKeySigner) // 在指定端口开启服务 address := net.JoinHostPort(SSH_SERVER.Host, SSH_SERVER.Port) listener, err := net.Listen("tcp", address) if err != nil { panic(fmt.Errorf("不能在 %s 上创建服务: %v", address, err)) } fmt.Println("Server Address:", address) // 连接到系统 shell for { conn, err := listener.Accept() if err != nil { fmt.Println("Can not accept connection:", err) } go shell(conn, SSH_SERVER.config) } }