我写了一个文件管理器,现在我想允许用户输入密码,如果他想要复制或编辑需要sudo
的文件。我可以使用gksudo
或sudo
启动程序的新副本并隐藏当前副本。但这是否可以在同一过程中完成?
我已经阅读过geteuid
和其他一些函数的文章,但我觉得我在这里缺乏一些基本的理解,因为对我来说没有多大意义。
答案 0 :(得分:0)
为了执行仅限root的操作,进程必须以有效uid为0开始,或者具有允许它模拟此类euid(CAP_SETUID)的功能。
使用特殊文件系统属性设置有效uid,称为“setuid”标志:
# ls -l /bin/su
-rws--x--x 1 root root 36720 Mar 28 2013 /bin/su
记下文件权限标记中的's'。
以上意思是,当任何用户运行su
命令时,它将代表可执行文件的所有者运行,在本例中为root(因此该进程将以您的普通用户ID运行,但有效的用户ID将是root
用户的那个。因此,这样的过程将能够做任何事情root
。
另一种更现代的方法是提供流程选择功能,例如CAP_SETUID
。可以使用setcap
/ getcap
命令设置和查询这些命令,并允许更精细的控制过程可以做什么和不能做什么。这是否会带来更安全的系统,仍然是一个悬而未决的问题。
https://wiki.archlinux.org/index.php/Using_File_Capabilities_Instead_Of_Setuid
可能存在安全问题的概述:
http://forums.grsecurity.net/viewtopic.php?f=7&t=2522&sid=c6fbcf62fd5d3472562540a7e608ce4e#p10271