在 Linux 下追溯进程的发起者

系统
在 Linux 下要确认一个进程的发起者身份,比如用户 tom 登录系统,sudo su - 到 root,然后执行了脚本 hey.sh,要想在 hey.sh 中追溯到发起进程的是 tom 这个用户,并不是很容易做到准确无误,花了点时间,找到了一个相对靠谱的方式。

在 Linux 下要确认一个进程的发起者身份,比如用户 tom 登录系统,sudo su - 到 root,然后执行了脚本 hey.sh,要想在 hey.sh 中追溯到发起进程的是 tom 这个用户,并不是很容易做到准确无误,花了点时间,找到了一个相对靠谱的方式。

先说说遇到的几个问题:

  1. 用户登录之后,使用 sudo hey.sh 的方式执行 hey.sh,倒是可以通过环境变量 SUDO_USER 获取到 sudo 之前的用户,但没有办法解决上面提到的 sudo su - 这样不继承之前用户环境变量的问题。
  2. 可以用 tty 命令获取当前进程的 controlling terminal,然后通过 controlling terminal 文件的属主来确认登录用户,这可以解决 1 中提到的问题,但是如果当前进程的父进程是 daemon 或者关掉了标准输入,就没有 controlling terminal。
  3. 可以通过读取 /proc/self/loginuid 获取当前进程的登录用户 ID,对于没有 controlling terminal 的进程也可以获取到 ID,但对于 daemon 进程来说,获取的 ID 可能是 4294967295。

在我的场景下,对于第三个问题,并不是特别要紧,找不到对应的用户,fallback 回 effective user 就好, 所以,用来追溯进程发起用户身份的 bash 脚本是这样:

  1. #!/bin/bash 
  2. # A relatively reliable way to find process initiator on Linux 
  3. user_entry=`getent passwd $(cat /proc/self/loginuid)` 
  4. if [ $? -eq 0 ]; then 
  5.      login_user=`echo ${user_entry} | cut -d: -f1` 
  6. else 
  7.      login_user=${SUDO_USER:-${LOGNAME}} 
  8.      if [ "${login_user}" = "" ]; then 
  9.           login_user=`id -urn` 
  10.      fi 
  11. fi  
  12. echo ${login_user} 
责任编辑:黄丹 来源: xupeng.me
相关推荐

2013-12-19 15:01:03

LinuxLinux进程

2015-12-31 09:10:48

DebianIan Murdock去世

2021-03-08 09:41:50

​Aurora自动驾驶

2014-08-01 15:38:37

Linux进程管理

2020-09-18 11:19:03

恶意软件Linux网络攻击

2017-04-11 16:00:40

Linuxsyslog进程

2017-05-03 11:10:14

Linux进程监控cpustat

2009-09-16 08:43:51

linux进程线程

2010-01-05 10:00:48

Linux进程间通信

2016-08-23 10:17:42

2017-05-27 14:45:04

Linux命令进程

2019-05-08 11:10:05

Linux进程语言

2019-07-10 10:40:10

Linux库注入命令

2009-10-27 08:57:50

linux杀死进程

2019-05-23 10:11:39

Python编程语言singledispa

2019-08-08 14:40:18

开发者技能工具

2022-09-19 13:21:15

Linux进程

2010-01-22 10:51:54

svn命令linux

2010-07-14 10:41:58

Perl线程

2009-12-16 13:11:13

Fedora操作系统
点赞
收藏

51CTO技术栈公众号