应先用loginctl list-sessions筛选ssh类型会话并记录session ID,再通过loginctl show-session -p Leader获取Leader PID,最后结合ps --forest或pstree定位归属该会话的用户进程及5分钟内新启动的命令。

在银河麒麟V10上排查他人通过SSH远程执行的命令或残留进程时,必须精准区分“谁在哪个会话里干了什么”,否则容易误杀图形界面或系统关键进程。
确认当前所有SSH登录会话
执行 loginctl list-sessions,输出中类型为 ssh 的行即为远程SSH会话(非tty/x11),注意记录其session ID(如c12、3、r4);若无ssh类型,说明当前无人SSH登录,后续步骤可跳过。
这一步不可省略——【仅靠ps aux | grep ssh无法识别会话归属,且sshd父进程常被误判为“用户进程”】。
提取指定SSH会话的全部用户级进程
方法一(推荐):用session ID直接查子进程树
执行 loginctl show-session c12 -p Leader -q | xargs -I{} ps --forest -o pid,ppid,comm,user -s {}(将c12替换为你查到的真实ID),结果中每个进程的PPID都指向该会话Leader,且USER列明确标注属主。
方法二:反向定位——从sshd进程出发找子shell
执行 ps -eo pid,ppid,comm,user | awk '$3 ~ /^sshd$/ {print $1}' | while read p; do pstree -p $p | grep -E "(bash|zsh|sh)"; done 2>/dev/null,该命令遍历所有sshd进程,只显示其下挂载的交互式shell及其子命令,避开systemd、dbus等无关进程。
过滤出最近5分钟内由SSH触发的新进程
第一步:获取所有SSH会话的Leader PID并存入临时文件loginctl list-sessions | awk '$2=="ssh" {print $1}' | xargs -I{} loginctl show-session {} -p Leader -q > /tmp/ssh_leaders.txt
第二步:用这些Leader PID作为根,查其启动后5分钟内的全部子孙进程while read pid; do ps -eo pid,etimes,comm,user --sort=-etimes | awk -v leader="$pid" '$1==leader || $2>300 {print $0}'; done
注意:etimes字段单位为秒,>300表示进程存活超5分钟——【此条件能排除刚登录未执行命令的空闲shell,直击真实操作痕迹】。

















