有没有办法递归地打印出我当前所在的所有本地和远程 shell?
例如,在我的本地计算机上,我将 ssh 到另一台计算机。从那里,我可以切换用户(打开另一个 shell)。然后我再次 ssh 到我的本地计算机,等等。更复杂的是,我通常会有多个 shell 选项卡(甚至窗口),所以我通常记不住每个选项卡的踪迹。
我想要的是将这些会议中的每一个都按照我所在的位置打印出来。或者至少如果我是exit
当前的 shell,我会被踢回哪个 shell。
打开多个 shell 几天或几周后,我不知道如果我输入 ,我会被发送到哪里exit
。我的 shell 窗口会关闭吗(因为我位于“root”shell)?我会被踢回另一台服务器吗?
换句话说,我想要跟踪我的 SSH 跃点。
答案1
您可以编写一个脚本,沿着进程树向上走,打印出唯一的用户名/pid/可执行文件/任何在列表中向上移动的内容,并在它最终离开终端时停止。 sshd 通常在对用户执行 setuid() 后开始侦听 TTY,因此连接到 TTY 的最早进程将以您登录的用户身份运行。
这是该概念的 Linux 特定 Bash 脚本版本。
脚本输出:
简单的 sudo 到 root:
[root@ditirlns04 ~]# ./test.sh
Current User: 0
Previous UID: 504
UID 504 是我登录盒子的方式,因此它可以工作:
[root@ditirlns04 ~]# logname
jadavis6
[root@ditirlns04 ~]# id jadavis6
uid=504(jadavis6) gid=504(jadavis6) groups=504(jadavis6),16777216(enterprise admins),16777217(ncatsys),16777218(sms admins),16777219(domain admins),16777220(aggieanywhere),16777221(group policy creator owners),16777222(tlh-test),16777223(dba admins),16777224(domain controllers),16777225(cupsadmin),16777226(linuxusers),16777227(da admins),16777228(webdev),16777229(schema admins),16777230,16777231(changeauditor operators - ncat),16777232(configmgr remote control users),16777233(changeauditor administrators - ncat),16777234(telnetclients),16777235(denied rodc password replication group)
与上面相同,仅通过中间用户(即:登录 504,sudo 到 root,sudo 到常规 UID 501,然后返回 root):
[root@ditirlns04 ~]# ./test.sh
Current User: 0
Previous UID: 501
Previous UID: 0
Previous UID: 504
[root@ditirlns04 ~]#
因此,每个 UID 转换都会按照其发生的相反顺序进行捕获。如果您需要以相同的顺序进行转换,只需将脚本放入一个函数中即可获取输出:
[root@ditirlns04 ~]# ./test.sh | tac
Previous UID: 504
Previous UID: 0
Previous UID: 501
Current User: 0
[root@ditirlns04 ~]#
脚本主体:
#!/bin/bash
currentPID=$$
currentUser=$(id -u)
currentTTY=$(awk '{print $7}' /proc/$$/stat)
echo "Current User: $currentUser"
while /bin/true; do
parentPID=$(awk '{print $4}' /proc/$currentPID/stat)
parentTTY=$(awk '{print $7}' /proc/$currentPID/stat)
if [ $parentTTY -ne $currentTTY ]; then
break
fi
parentUser=$(awk '/^Uid:/ {print $2}' /proc/$currentPID/status)
if [[ "x$parentUser" != "x$currentUser" ]]; then
echo "Previous UID: $parentUser"
fi
currentPID=$parentPID
currentUser=$parentUser
done
基本上,它只是利用每个 pidstat
和status
文件。您可以制作更多独立于平台的版本来包装ps
输出,但当数据以要解析的格式随时可用时,我不信任解析命令输出,因此我选择了 procfs 路线。
基本上,每当它找到新的 UID 时,它都会将其打印出来。它们保证与用户 sudo 的顺序相同,因此它应该有效地覆盖您在该计算机上的整个登录会话。如果您愿意,您应该能够轻松修改上述内容以打印 PID 或命令名称,但通常在这方面思考的人更关心他们将作为谁运行,而不是将运行的 shell 程序。
答案2
启动的 shellsshd
可以通过变量的存在来识别这一点$SSH_CLIENT
。另一个变量$SHLVL
可以指示从同一主机上的另一个 shell 启动的 shell。如果您需要进一步跟踪,请选择一个变量并允许sshd
从远程 ssh 客户端接受它。
答案3
您可以使用以下ps
命令查看您的 shell。它并不完美,但很好地以漂亮的树格式显示了 shell 的层次结构:
$ ps auxw --forest | grep -E "gnome-terminal|\_ bash|-bash|sshd|login "
您还可以通过使用以下命令查看当前 shell 的 PID 来找出您所在的 shell $$
:
$ echo $$
例子
$ ps auxw --forest | grep -E "gnome-terminal|\_ bash|-bash|sshd|login "
root 1751 0.0 0.0 67824 820 ? Ss Jun24 0:00 login -- root
root 989 0.0 0.0 114116 928 tty2 Ss+ Jun30 0:00 \_ -bash
saml 6018 0.0 0.1 553356 13296 ? Sl Jun24 3:42 gnome-terminal
saml 8182 0.0 0.0 115104 992 pts/2 Ss+ Jun24 0:00 \_ bash
saml 3483 0.0 0.0 115156 936 pts/62 Ss Jun27 0:02 \_ bash
saml 3742 0.0 0.0 114972 1712 pts/64 Ss+ Jun28 0:00 \_ bash
saml 7368 0.0 0.0 122544 4608 pts/65 Ss Jun28 0:05 \_ bash
saml 32256 0.0 0.0 114980 6320 pts/65 S 20:54 0:00 | \_ bash
saml 3753 0.0 0.0 115036 1960 pts/81 Ss+ Jul03 0:01 \_ bash
saml 12843 0.0 0.0 115076 5204 pts/82 Ss+ Jul03 0:01 \_ bash
saml 14702 0.0 0.0 114972 6392 pts/87 Ss 16:04 0:00 \_ bash
root 26084 0.0 0.0 75096 1152 ? Ss 09:40 0:00 /usr/sbin/sshd
root 32345 0.0 0.0 106716 3840 ? Ss 20:55 0:00 \_ sshd: saml [priv]
saml 32349 0.0 0.0 106716 1800 ? S 20:55 0:00 \_ sshd: saml@pts/88
saml 32352 0.0 0.0 114908 6304 pts/88 Ss 20:55 0:00 \_ -bash
saml 32764 0.0 0.0 103380 820 pts/88 S+ 21:02 0:00 \_ grep --color=auto -E gnome-terminal|\_ bash|-bash|sshd|login
我的 PID 是多少?
$ echo $$
32352
所以我在这里:
saml 32352 0.0 0.0 114908 6304 点/88 SS 20:55 0:00 _ -bash
# Now if I exit
$ exit
# I'm in this shell now
$ echo $$
32256
我现在就在这:
萨姆尔 32256 0.0 0.0 114980 6320 分/65 S 20:54 0:00 | _ bash
# Another exit
$ exit
# I'm now here
$ echo $$
7368
我终于来了:
saml 7368 0.0 0.0 122544 4608 点/65 Ss Jun28 0:05 _ bash