diff options
Diffstat (limited to 'main.go')
| -rw-r--r-- | main.go | 67 |
1 files changed, 67 insertions, 0 deletions
@@ -0,0 +1,67 @@ +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) + } + +} |
