From de1150f6caa24b77b5b6ea36d8e827ee841486e7 Mon Sep 17 00:00:00 2001 From: HynoR <20227709+HynoR@users.noreply.github.com> Date: Fri, 5 Dec 2025 19:35:59 +0800 Subject: [PATCH] fix: Improve SSH session retrieval by grouping users by host in process_data.go --- agent/utils/websocket/process_data.go | 80 +++++++++++++++++---------- 1 file changed, 51 insertions(+), 29 deletions(-) diff --git a/agent/utils/websocket/process_data.go b/agent/utils/websocket/process_data.go index 8f8cd01d1..aa6f2361d 100644 --- a/agent/utils/websocket/process_data.go +++ b/agent/utils/websocket/process_data.go @@ -3,12 +3,13 @@ package websocket import ( "encoding/json" "fmt" - "github.com/1Panel-dev/1Panel/agent/utils/common" "sort" "strings" "sync" "time" + "github.com/1Panel-dev/1Panel/agent/utils/common" + "github.com/1Panel-dev/1Panel/agent/global" "github.com/1Panel-dev/1Panel/agent/utils/files" "github.com/shirou/gopsutil/v4/host" @@ -252,46 +253,67 @@ func getSSHSessions(config SSHSessionConfig) (res []byte, err error) { users []host.UserStat processes []*process.Process ) - processes, err = process.Processes() - if err != nil { - return - } users, err = host.Users() if err != nil { res, err = json.Marshal(result) return } + + usersByHost := make(map[string][]host.UserStat) + for _, user := range users { + if user.Host == "" { + continue + } + if config.LoginUser != "" && !strings.Contains(user.User, config.LoginUser) { + continue + } + if config.LoginIP != "" && !strings.Contains(user.Host, config.LoginIP) { + continue + } + usersByHost[user.Host] = append(usersByHost[user.Host], user) + } + + if len(usersByHost) == 0 { + res, err = json.Marshal(result) + return + } + + processes, err = process.Processes() + if err != nil { + return + } + for _, proc := range processes { name, _ := proc.Name() if name != "sshd" || proc.Pid == 0 { continue } connections, _ := proc.Connections() + if len(connections) == 0 { + continue + } + + cmdline, cmdErr := proc.Cmdline() + if cmdErr != nil { + continue + } + for _, conn := range connections { - for _, user := range users { - if user.Host == "" { - continue - } - if conn.Raddr.IP == user.Host { - if config.LoginUser != "" && !strings.Contains(user.User, config.LoginUser) { - continue - } - if config.LoginIP != "" && !strings.Contains(user.Host, config.LoginIP) { - continue - } - if terminal, err := proc.Cmdline(); err == nil { - if strings.Contains(terminal, user.Terminal) { - session := sshSession{ - Username: user.User, - Host: user.Host, - Terminal: user.Terminal, - PID: proc.Pid, - } - t := time.Unix(int64(user.Started), 0) - session.LoginTime = t.Format("2006-1-2 15:04:05") - result = append(result, session) - } - } + matchedUsers, exists := usersByHost[conn.Raddr.IP] + if !exists { + continue + } + + for _, user := range matchedUsers { + if strings.Contains(cmdline, user.Terminal) { + t := time.Unix(int64(user.Started), 0) + result = append(result, sshSession{ + Username: user.User, + Host: user.Host, + Terminal: user.Terminal, + PID: proc.Pid, + LoginTime: t.Format("2006-1-2 15:04:05"), + }) } } }