fix: Improve SSH session retrieval by grouping users by host in process_data.go (#11210)

This commit is contained in:
KOMATA 2025-12-08 16:39:08 +08:00 committed by GitHub
parent af48fed3c2
commit bb72ea0fc0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -3,12 +3,13 @@ package websocket
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/1Panel-dev/1Panel/agent/utils/common"
"sort" "sort"
"strings" "strings"
"sync" "sync"
"time" "time"
"github.com/1Panel-dev/1Panel/agent/utils/common"
"github.com/1Panel-dev/1Panel/agent/global" "github.com/1Panel-dev/1Panel/agent/global"
"github.com/1Panel-dev/1Panel/agent/utils/files" "github.com/1Panel-dev/1Panel/agent/utils/files"
"github.com/shirou/gopsutil/v4/host" "github.com/shirou/gopsutil/v4/host"
@ -252,46 +253,67 @@ func getSSHSessions(config SSHSessionConfig) (res []byte, err error) {
users []host.UserStat users []host.UserStat
processes []*process.Process processes []*process.Process
) )
processes, err = process.Processes()
if err != nil {
return
}
users, err = host.Users() users, err = host.Users()
if err != nil { if err != nil {
res, err = json.Marshal(result) res, err = json.Marshal(result)
return 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 { for _, proc := range processes {
name, _ := proc.Name() name, _ := proc.Name()
if name != "sshd" || proc.Pid == 0 { if name != "sshd" || proc.Pid == 0 {
continue continue
} }
connections, _ := proc.Connections() connections, _ := proc.Connections()
if len(connections) == 0 {
continue
}
cmdline, cmdErr := proc.Cmdline()
if cmdErr != nil {
continue
}
for _, conn := range connections { for _, conn := range connections {
for _, user := range users { matchedUsers, exists := usersByHost[conn.Raddr.IP]
if user.Host == "" { if !exists {
continue continue
} }
if conn.Raddr.IP == user.Host {
if config.LoginUser != "" && !strings.Contains(user.User, config.LoginUser) { for _, user := range matchedUsers {
continue if strings.Contains(cmdline, user.Terminal) {
} t := time.Unix(int64(user.Started), 0)
if config.LoginIP != "" && !strings.Contains(user.Host, config.LoginIP) { result = append(result, sshSession{
continue Username: user.User,
} Host: user.Host,
if terminal, err := proc.Cmdline(); err == nil { Terminal: user.Terminal,
if strings.Contains(terminal, user.Terminal) { PID: proc.Pid,
session := sshSession{ LoginTime: t.Format("2006-1-2 15:04:05"),
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)
}
}
} }
} }
} }