有没有办法知道哪些其他用户已切换到该用户?

有没有办法知道哪些其他用户已切换到该用户?

我们有一个系统,使用不同的系统帐户来控制不同的环境。我的标准流程如下:

$ ssh server.example.com
robin@server$ sudo su - env1-controller
env1-controller@server$ deploy

然而,可能有许多人做同样的事情,转向用户env1-controller。我们有可能同时尝试修改环境,从而互相影响。

有什么方法可以检查当前是否有其他人正在使用该env1-controller用户?

答案1

如果每个人都使用 sudo,您可以考虑使用类似的方法ps -ax | grep sudo查看谁当前正在使用sudo或,env1-controller并且通过运行who,您可以了解谁实际在运行它。

以我的机器为例,其输出ps -ax | grep sudo如下:

24324 pts/0    S      0:00 sudo su <user>

第一个条目是 PID,第二个是 TTY,第三个是时间和最后一个命令。如果您使用,who您将获得当前登录用户及其正在使用的 TTY 的列表。它可能看起来像这样:

<user>     pts/0        Nov 23 10:24 (<IP>)
<user>     pts/2        Nov 23 10:25 (<IP>)

因此,通过该组合,您可以知道 连接sudo到用户正在使用的任何pts/0。这将是手动检查的方式。

我的猜测是可以将这些信息结合起来,但我的 bash 技能还不够好,无法仅仅发布如何做到这一点的答案。

该问题原作者使用的最终解决方案是:

我实际上最终使用 grep 来提取精确的 TTY 号码,ps -aux | grep -v grep | grep "sudo su - whoami" | grep -E -o 'pts/[0-9]+' | grep -E -o '[0-9]+'然后用它ls -l /dev/pts/${id}来确定谁拥有 TTY。

这样做的目的是:

  • 用于ps -aux获取所有正在运行的进程的列表,包括一些附加信息。
  • grep所有不包含的行,grep以便从输出中排除 grep。
  • grep所有包含 的进程的行sudo
  • greppts/<number>这些行中的文本。
  • grep只是数字。
  • 用于ls检查谁是该 TTY 的所有者。

利用这些信息,您可以尝试执行以下操作(如果您想使用 who):

who | grep $(ps -ax | grep -v grep | grep "sudo su - whoami" | grep -E -o 'pts/[0-9]+')

但只有在只有一个结果的情况下它才会起作用,因为 的输出$()会有多行。正如您所见,我跳过了 ,u因为ps基本脚本不需要添加信息即可运行。

相关内容