遇到的问题:
最近rmc的app:rmc_rtapp在普通用户下总是运行报错,看代码可知:程序运行时获取euid,当euid != 0时报错,那如何让普通用户执行的app临时获取root权限呢?
转:https://blog.csdn.net/weixin_42072280/article/details/88657563
UID:真实的用户ID 进程的UID就是其创建者的用户ID,用于标识进程的属主。
EUID:有效的用户ID
(1)只有进程的创建者和root用户才有权利对该进程进行操作。于是,记录一个进程的创建者(也就是属主)就显得非常必要。
(2)EUID,用来确定进程对某些资源和文件的访问权限。在大多数情况下,进程的UID和EUID是一样的 —— 除了著名的setuid程序。
(3)什么是setuid程序? 例如:passwd命令,这个命令允许用户修改自己的登录口令。但是密码保存在/etc/shadow文件中,这个文件对普通用户是不可读的,那么用户怎么能够通过修改shadow文件来修改自己的口令呢?这就是setuid的妙处了。
setuid通过使passwd在执行阶段具有文件所有者(也就是root)的权限,让用户临时有了修改shadow文件的能力(当然这种能力是受到限制的)。因此,passwd就是一个经典的setuid程序,其UID是当前执行这个命令的用户ID,而EUID则是root用户的ID(也就是0)。
例子:
/usr/bin/passwd 这个可执行文件
从上面passwd的属性可以看到,权限位中有个s,这就是suid
passwd这个命令是用来修改密码的,而密码文件是/etc/shadow,且查看密码文件的属性可以看到它的拥有者是root,root可读写,用户组可读的。
既然这个文件是root可读写,那非root用户修改密码要怎么办呢?
这时候就要说的suid了,当非root用户调用passwd修改密码时,此时的euid将会变为passwd的拥有者用户,即root用户,这样就可以修改密码了。
与其说suid是一个id,不如说它是文件的一个标志,它标志着这个可执行文件在执行时的euid将会被修改为它拥有者的uid。
参考:https://blog.csdn.net/charles_neil/article/details/79762334
设置suid:
chmod u+s rmc_rtapp
取消suid:
chmod u-s rmc_rtapp
我的例子
这个例子和我的类似了,要想rmc_rtapp普通用户执行时临时获取root权限,就要给他suid,同时让他的拥有者是root,这样在运行时,euid=0.
1:chmod 0750 rmc_rtapp 设置文件执行权限
2:chmod u+s rmc_rtapp 设置suid
3: chown root:mi rmc_rtapp 设置拥有者为root