- commit
- 5761ff4
- parent
- fa97ce3
- author
- Antonio Mika
- date
- 2025-03-10 23:14:55 -0400 EDT
Set command properly
3 files changed,
+66,
-18
+5,
-1
1@@ -48,9 +48,9 @@ func StartSshServer(cfg *PgsConfig, killCh chan error) {
2 PublicKeyCallback: sshAuth.PubkeyAuthHandler,
3 },
4 Middleware: []pssh.SSHServerMiddleware{
5+ sftp.Middleware(handler),
6 pipe.Middleware(handler, ""),
7 list.Middleware(handler),
8- sftp.Middleware(handler),
9 scp.Middleware(handler),
10 rsync.Middleware(handler),
11 auth.Middleware(handler),
12@@ -58,6 +58,10 @@ func StartSshServer(cfg *PgsConfig, killCh chan error) {
13 Middleware(handler),
14 pssh.LogMiddleware(handler, handler.Cfg.DB),
15 },
16+ SubsystemMiddleware: []pssh.SSHServerMiddleware{
17+ sftp.Middleware(handler),
18+ pssh.LogMiddleware(handler, handler.Cfg.DB),
19+ },
20 })
21
22 pemBytes, err := os.ReadFile("ssh_data/term_info_ed25519")
R pssh/sshServer.go =>
pssh/server.go
+61,
-17
1@@ -5,6 +5,7 @@ import (
2 "errors"
3 "log/slog"
4 "net"
5+ "strings"
6 "sync"
7 "time"
8
9@@ -141,7 +142,10 @@ func (sc *SSHServerConn) Handle(chans <-chan ssh.NewChannel, reqs <-chan *ssh.Re
10 select {
11 case <-sc.Done():
12 return nil
13- case newChan := <-chans:
14+ case newChan, ok := <-chans:
15+ if !ok {
16+ return nil
17+ }
18 sc.Logger.Info("new channel", "type", newChan.ChannelType(), "extraData", newChan.ExtraData())
19 switch newChan.ChannelType() {
20 case "session":
21@@ -156,26 +160,65 @@ func (sc *SSHServerConn) Handle(chans <-chan ssh.NewChannel, reqs <-chan *ssh.Re
22 select {
23 case <-sc.Done():
24 return
25- case req := <-requests:
26- if req == nil {
27- continue
28+ case req, ok := <-requests:
29+ if !ok {
30+ return
31 }
32+
33 sc.Logger.Info("new session request", "type", req.Type, "wantReply", req.WantReply, "payload", req.Payload)
34+ if req.Type == "subsystem" {
35+ if len(sc.SSHServer.Config.SubsystemMiddleware) == 0 {
36+ req.Reply(false, nil)
37+ continue
38+ }
39+
40+ h := func(*SSHServerConnSession) error { return nil }
41+ for _, m := range sc.SSHServer.Config.SubsystemMiddleware {
42+ h = m(h)
43+ }
44+
45+ if err := h(&SSHServerConnSession{
46+ Channel: channel,
47+ SSHServerConn: sc,
48+ }); err != nil {
49+ req.Reply(false, nil)
50+ continue
51+ }
52+
53+ req.Reply(true, nil)
54+ } else if req.Type == "exec" {
55+ if len(sc.SSHServer.Config.Middleware) == 0 {
56+ req.Reply(false, nil)
57+ continue
58+ }
59+
60+ sesh := &SSHServerConnSession{
61+ Channel: channel,
62+ SSHServerConn: sc,
63+ }
64+
65+ sesh.SetValue("command", strings.Fields(string(req.Payload[4:])))
66+
67+ h := func(*SSHServerConnSession) error { return nil }
68+ for _, m := range sc.SSHServer.Config.Middleware {
69+ h = m(h)
70+ }
71+
72+ if err := h(sesh); err != nil {
73+ req.Reply(false, nil)
74+ continue
75+ }
76+
77+ req.Reply(true, nil)
78+ }
79 }
80 }
81 }()
82-
83- h := func(*SSHServerConnSession) error { return nil }
84- for _, m := range sc.SSHServer.Config.Middleware {
85- h = m(h)
86- }
87-
88- return h(&SSHServerConnSession{
89- Channel: channel,
90- SSHServerConn: sc,
91- })
92 }
93- case req := <-reqs:
94+ case req, ok := <-reqs:
95+ if !ok {
96+ return nil
97+ }
98 sc.Logger.Info("new request", "type", req.Type, "wantReply", req.WantReply, "payload", req.Payload)
99 }
100 }
101@@ -211,8 +254,9 @@ type SSHServerMiddleware func(SSHServerHandler) SSHServerHandler
102
103 type SSHServerConfig struct {
104 *ssh.ServerConfig
105- ListenAddr string
106- Middleware []SSHServerMiddleware
107+ ListenAddr string
108+ Middleware []SSHServerMiddleware
109+ SubsystemMiddleware []SSHServerMiddleware
110 }
111
112 type SSHServer struct {
R pssh/sshServer_test.go =>
pssh/server_test.go
+0,
-0