获取当前进程保存的set-user-id

时间:2018-10-08 14:38:11

标签: ruby unix process privileges

很明显,如何获取当前正在运行的进程的真实用户ID Process.uid)和有效用户ID Process.euid) Ruby在stdlib帮助下。但是我想知道保存的设置用户ID 的同级方法在哪里,比如Process.suid?只有Process::UID.sid_available?方法可以确定运行的平台是否支持所描述的功能。

2 个答案:

答案 0 :(得分:1)

好吧,您不会喜欢这样,但是AFAICT,这是为该过程获取suid的唯一方法。

suid = `ps -o pid,suid`[/(?<=^#{Process.pid}\s)\s*\d+/].strip
#⇒ "1000"

可能应该检查suid是否可用。基本上,此regexp搜索从当前进程的pid开始的行。

答案 1 :(得分:1)

基于以下问题的答案:https://superuser.com/questions/1149421/how-do-i-find-the-effective-user-id-euid-real-user-id-ruid-and-saved-user-i

  

可以在此处猜测初始有效UID(以及保存的UID):由于该文件设置了'setuid'标志,并且由用户'anna'拥有,因此运行该文件将创建一个具有有效“ anna”用户的UID。

suid是文件上的属性之一,因此我们可以比较当前进程的uid和文件的所有者id

摘自文档https://ruby-doc.org/core-1.9.3/File/Stat.html#method-i-owned-3F

您可以尝试从统计信息中使用此方法:

  

owned? → true or false

     

如果进程的有效用户ID与stat的所有者相同,则返回true。   例子:   File.stat("testfile").owned? #=> true

     

File.stat("/etc/passwd").owned? #=> false

如果进程uid和文件所有者不相等,我们可以说二进制文件具有suid,并且我们可以更好地确定文档中是否存在带有下一个方法的suid:

https://ruby-doc.org/core-1.9.3/File/Stat.html#method-i-setuid-3F

  

setuid? → true or false

     

如果stat设置了set-user-id许可权位,则返回true;否则返回false;如果stat或操作系统不支持此功能,则返回false。

     

File.stat("/bin/su").setuid? #=> true