summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
authorrunoneall <runoneall@serv00.net>2025-09-11 11:19:12 +0200
committerrunoneall <runoneall@serv00.net>2025-09-11 11:19:12 +0200
commit59c5a6c4950d340d248431b84452d86329024d76 (patch)
tree71d5e243090a319f35c6b35046e81ddf7271dc35 /main.go
parent1ac4476d0a226c319200720a6ff63a5471bdc104 (diff)
add ssh server
Diffstat (limited to 'main.go')
-rw-r--r--main.go67
1 files changed, 67 insertions, 0 deletions
diff --git a/main.go b/main.go
new file mode 100644
index 0000000..1bbe285
--- /dev/null
+++ b/main.go
@@ -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)
+ }
+
+}