Unix Proc目录

时间:2020-03-06 14:19:51  来源:igfitidea点击:

我正在尝试查找包含当前用户ID的虚拟文件。有人告诉我可以在proc目录中找到它,但不太确定是哪个文件。

解决方案

我不确定可以在/ proc中找到它。我们可以尝试使用getuid()函数或者$$ USER环境变量。

为什么不只使用"id -u"?

我们很可能想要检查$ USER环境变量。其他选项包括getuidid -u,但是搜索/ proc当然不是最好的操作方法。

据我所知,/ proc是特定于Linux的,通常不是在UNIX中。如果我们真的只想要当前的UID,请使用getuid()或者geteuid()函数。

如果我们知道仅使用Linux,则可以浏览/ proc / self / *下的层次结构,其中包含有关当前进程的各种信息。请记住,/ proc是"神奇的",它是内核服务的虚拟文件系统,其内容在我们请求时动态生成。因此,它可以返回特定于当前进程的信息。

例如,尝试以下命令:cat / proc / self / status

/ proc / process_id / status中(至少在Linux上),我们会发现这样的一行:

Uid:      1000    1000    1000    1000

这会告诉我们该进程正在其帐户下运行的用户的uid。

但是,要找出当前进程的进程ID,我们将需要系统调用,然后我们也可以调用getuid直接获取uid。

编辑:啊,`/ proc / self / status ......每天都在学习新东西!

我们实际上需要/ 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行上的第一个数字。我们可以通过查看/ etc / passwd来查找哪个uid编号映射到哪个用户名,或者调用相关函数以将uid映射到使用任何语言的用户名。

理想情况下,我们只需调用系统调用getuid()来查找此信息,通过查看/ proc /会适得其反。

我们正在寻找的东西可能在环境变量中。在检查环境变量时,需要注意所使用的外壳程序。 bash使用" UID",而tcsh使用" uid",在* nix情况下很重要。我还发现tcsh设置了" gid",但是在bash中找不到匹配的变量。