我们有一个系统,使用不同的系统帐户来控制不同的环境。我的标准流程如下:
$ 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
。grep
pts/<number>
这些行中的文本。grep
只是数字。- 用于
ls
检查谁是该 TTY 的所有者。
利用这些信息,您可以尝试执行以下操作(如果您想使用 who):
who | grep $(ps -ax | grep -v grep | grep "sudo su - whoami" | grep -E -o 'pts/[0-9]+')
但只有在只有一个结果的情况下它才会起作用,因为 的输出$()
会有多行。正如您所见,我跳过了 ,u
因为ps
基本脚本不需要添加信息即可运行。