很明显,如何获取当前正在运行的进程的真实用户ID (Process.uid
)和有效用户ID (Process.euid
) Ruby在stdlib帮助下。但是我想知道保存的设置用户ID 的同级方法在哪里,比如Process.suid
?只有Process::UID.sid_available?
方法可以确定运行的平台是否支持所描述的功能。
答案 0 :(得分:1)
好吧,您不会喜欢这样,但是AFAICT,这是为该过程获取suid
的唯一方法。
suid = `ps -o pid,suid`[/(?<=^#{Process.pid}\s)\s*\d+/].strip
#⇒ "1000"
可能应该检查suid
是否可用。基本上,此regexp搜索从当前进程的pid
开始的行。
答案 1 :(得分:1)
可以在此处猜测初始有效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