我可以递归打印所有当前的远程 shell 吗?

我可以递归打印所有当前的远程 shell 吗?

有没有办法递归地打印出我当前所在的所有本地和远程 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

基本上,它只是利用每个 pidstatstatus文件。您可以制作更多独立于平台的版本来包装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

相关内容