我正在尝试查找包含当前用户 ID 的虚拟文件。有人告诉我可以在 proc 目录中找到它,但不太确定是哪个文件。
7 回答
您实际上想要/proc/self/status
,它将为您提供有关当前执行进程的信息。
这是一个例子:
$ cat /proc/self/status
Name: cat
State: R (running)
Tgid: 17618
Pid: 17618
PPid: 3083
TracerPid: 0
Uid: 500 500 500 500
Gid: 500 500 500 500
FDSize: 32
Groups: 10 488 500
VmPeak: 4792 kB
VmSize: 4792 kB
VmLck: 0 kB
VmHWM: 432 kB
VmRSS: 432 kB
VmData: 156 kB
VmStk: 84 kB
VmExe: 32 kB
VmLib: 1532 kB
VmPTE: 24 kB
Threads: 1
SigQ: 0/32268
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
Cpus_allowed: 00000003
Mems_allowed: 1
voluntary_ctxt_switches: 0
nonvoluntary_ctxt_switches: 3
您可能想查看 Uid 和 Gid 行上的第一个数字。您可以通过查看来查找哪些 uid 数字映射到了哪个用户名/etc/passwd
,或者调用相关函数以将 uid 映射到您使用的任何语言的用户名。
理想情况下,您只需调用系统调用getuid()
来查找此信息,通过查看来做会/proc/
适得其反。
为什么不直接使用“ id -u
”?
我不确定是否可以在/proc
. 您可以尝试使用getuid()
函数或$USER
环境变量。
据我所知,/proc
它是特定于 Linux 的,而不是一般的 UNIX。如果您真的只想要当前的 UID,请使用getuid()
orgeteuid()
函数。
如果你知道你只会在 Linux 上,你可以探索下的层次结构/proc/self/*
,它包含有关当前进程的各种信息。请记住,这/proc
是“神奇的”,它是内核服务的虚拟文件系统,内容是在您请求它时动态生成的。因此它可以返回特定于当前进程的信息。
例如,试试这个命令:cat /proc/self/status
最有可能的是,您要么想要检查$USER
环境变量。其他选项包括getuid
and id -u
,但搜索/proc
肯定不是最好的操作方法。
在(至少在 Linux 上)你会发现这样一行:/proc/process_id/status
用户ID:1000 1000 1000 1000
这会告诉您进程正在其帐户下运行的用户的 uid。
但是,要找出当前进程的进程id,你需要一个系统调用,然后你也可以getuid
直接调用来获取uid。
编辑:啊,/proc/self/status
……每天都在学习新东西!
您正在寻找的东西可能在环境变量中。检查环境变量时,您需要注意使用的 shell。bash 使用“UID”,而 tcsh 使用“uid”,*nix
以防万一。我还发现 tcsh 设置了“gid”,但我无法在 bash 中找到匹配的变量。