文档章节

setuid() 和 setgid()函数浅析

成长中的小白
 成长中的小白
发布于 2015/04/28 17:35
字数 694
阅读 46
收藏 0
点赞 0
评论 0

函数名 setuid - set user identity(设置用户ID)

                #include <sys/types.h>
                #include <unistd.h>

函数       int setuid(uid_t uid);
描述       setuid()  sets the effective user ID of the calling process.  If the effective UID of the caller is root, the real UID and                 saved set-user-ID

返回值   On  success,  zero is returned.  On error, -1 is returned, and errno is  set appropriately.

说明:

只有root用户才能调用成功setuid()函数来设置执行目前进程的用户ID,那么当root用户将调用setuid()成功后,此进程的用户ID不再是root用户的识别码,此后,再调用此函数就会失败。(举个例子:就好像只有有媳妇的人(具有root权限)的人才有机会休掉自己的老婆,成为单身,那么假设你休掉老婆后你再想休掉老婆是不可能的,因为你没老婆了。).

如果只是想暂时丢弃root权限稍后还想重新获取root权限,那么必须调用seteuid()函数。

给段代码:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>

void Show_Uid()
{
    printf("The UID is [%d] \n",getuid());
}
int main(void)
{
    int uid = 5000;
    Show_Uid();            //调用setuid之前查看UID

    if(setuid(uid) < 0)
        perror("set UID error");
    Show_Uid();            //设置UID之后
    
    if(setuid(2000) < 0)    //再次调用setuid设置UID
        perror("set UID error");     
       Show_Uid();            //设置UID之后    
    return 0;    
}

    用root权限执行

     real uid : 0
     ffective uid : 0
     real uid : 5000
     ffective uid : 5000

    setuid error: Operation not permitted            //因为上边将用户ID设置成5000,虽然以root权限运行,但是该进程的UID已经为5000,所以执行失败
    real uid : 5000
    ffective uid : 5000

    普通用户执行

    real uid : 1000
    ffective uid : 1000
    setuid error: Operation not permitted
    real uid : 1000
    ffective uid : 1000 

    setuid error: Operation not permitted
    real uid : 1000
    ffective uid : 1000

附加说明:一般在编写具 setuid root 的程序时, 为减少此类程序带来的系统安全风险, 在使用完root 权限后建议马上执行setuid(getuid());来抛弃root 权限. 此外, 进程uid 和euid 不一致时Linux 系统将不会产生core dump.(摘自于:http://c.biancheng.net/cpp/html/226.html)


函数名:setgid - set group identity(设置组ID)

SYNOPSIS
       #include <sys/types.h>
       #include <unistd.h>

       int setgid(gid_t gid);

DESCRIPTION
       setgid()  sets  the  effective group ID of the calling process.  If the caller is the superuser, the real GID and saved set-group-ID  are  also
       set.

函数说明:setgid()用来将目前进程的真实组识别码(real gid)设成参数gid 值. 如果是以超级用户身份执行此调用, 则real、effective 与savedgid 都会设成参数gid。(摘自于:http://c.biancheng.net/cpp/html/226.html)

返回值:设置成功则返回0, 失败则返回-1, 错误代码存于errno 中.

错误代码:
EPERM:并非以超级用户身份调用, 而且参数gid 并非进程的effective gid 或saved gid 值之一.


如有理解错误,请及时指出,谢谢

© 著作权归作者所有

共有 人打赏支持
成长中的小白
粉丝 0
博文 17
码字总数 11184
作品 0
深圳
程序员
setuid和setgid位详述

setuid和setgid位详述 分类: UNIX/LINUX 学习心得 2009-04-01 18:56136人阅读评论(0)收藏举报 setuid和setgid位 [1] setuid位 如果在可执行文件上设置了setuid位,运行可执行文件的进程将拥...

linhao_214 ⋅ 2011/07/23 ⋅ 0

关于set uid ,set gid,sticky bit的三个权限的详细说明

一个文件都有一个所有者, 表示该文件是谁创建的. 同时, 该文件还有一个组编号, 表示该文件所属的组, 一般为文件所有者所属的组. 如果是一个可执行文件, 那么在执行时, 一般该文件只拥有调用该...

90xa ⋅ 2015/12/10 ⋅ 0

Set uid, gid,sticky bit的三个权限的详细说明

转自:http://forum.ubuntu.org.cn/viewtopic.php?t=136913   每个文件都有一个所有者,表示该文件是谁创建的。同时,该文件还有一个组编号,表示该文件所属的组,一般为文件所有者所属的组...

科技探索者 ⋅ 2017/11/15 ⋅ 0

linux set uid ,set gid,sticky bit权限详细说明

一个文件都有一个所有者, 表示该文件是谁创建的. 同时, 该文件还有一个组编号, 表示该文件所属的组, 一般为文件所有者所属的组. 如果是一个可执行文件, 那么在执行时, 一般该文件只拥有调用该...

yolks丶 ⋅ 2016/10/09 ⋅ 0

Android 系统 root 破解原理分析(续)

上文《Android系统root破解原理分析》介绍了Android系统root破解之后,应用程序获得root权限的原理。有一些网友提出对于root破解过程比较感兴趣,也提出了疑问。本文将会对这个root破解过程进...

红薯 ⋅ 2012/06/19 ⋅ 3

linux系统权限大全

linux系统权限大全 一、 文件的归属: 文件所有者(owner)、用户组(group)、其它人(others) 二、查看 linux文件权限以及归属ls 命令 ls -al 查看文件详细权限和属性 权限 r w x 三、设置...

lzp5896 ⋅ 2017/07/21 ⋅ 0

Tcpdump源码分析系列6: main函数研究

ebuf = '0'; pd = pcapopenlive(device, snaplen, !pflag, 1000, ebuf); if (pd == NULL) error("%s", ebuf); else if (ebuf) warning("%s", ebuf); #endif / HAVEPCAPCREATE / //如果没有定......

强子哥哥 ⋅ 2013/10/25 ⋅ 0

chmod g+s 、chmod o+t 、chmod u+s

Set uid, gid,sticky bit的三个权限的详细说明 一个文件都有一个所有者, 表示该文件是谁创建的. 同时, 该文件还有一个组编号, 表示该文件所属的组, 一般为文件所有者所属的组. 如果是一个可执...

李_正 ⋅ 2016/04/21 ⋅ 0

Linux命令find -perm使用方法

花了点时间才将linux中find命令的-perm参数弄懂,分享一下。 find -perm,根据文件的权限来查找文件,有三种形式: find -perm mode find -perm -mode find -perm +mode 那么这三者之间有什么...

yolks丶 ⋅ 2016/10/09 ⋅ 0

Linux命令find -perm使用方法

花了点时间才将linux中find命令的-perm参数弄懂,分享一下。 find -perm,根据文件的权限来查找文件,有三种形式: find -perm mode find -perm -mode find -perm +mode 那么这三者之间有什么...

长平狐 ⋅ 2012/11/01 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

DevOps 资讯 | PostgreSQL 的时代到来了吗 ?

PostgreSQL是对象-关系型数据库,BSD 许可证。拼读为"post-gress-Q-L"。 作者: Tony Baer 原文: Has the time finally come for PostgreSQL?(有删节) 近30年来 PostgreSQL 无疑是您从未听...

RiboseYim ⋅ 5分钟前 ⋅ 0

Cube、Cuboid 和 Cube Segment

1.Cube (或Data Cube),即数据立方体,是一种常用于数据分析与索引的技术;它可以对原始数据建立多维度索引。通过 Cube 对数据进行分析,可以大大加快数据的查询效率 2.Cuboid 在 Kylin 中特...

无精疯 ⋅ 43分钟前 ⋅ 0

github太慢

1:用浏览器访问 IPAddress.com or http://tool.chinaz.com 使用 IP Lookup 工具获得github.com和github.global.ssl.fastly.net域名的ip地址 2:/etc/hosts文件中添加如下格式(IP最好自己查一...

whoisliang ⋅ 45分钟前 ⋅ 0

非阻塞同步之 CAS

为解决线程安全问题,互斥同步相当于以时间换空间。多线程情况下,只有一个线程可以访问同步代码。这种同步也叫阻塞同步(Blocking Synchronization). 这种同步属于一种悲观并发策略。认为只...

长安一梦 ⋅ 56分钟前 ⋅ 0

云计算的选择悖论如何对待?

人们都希望在工作和生活中有所选择。但心理学家的调查研究表明,在多种选项中进行选择并不一定会使人们更快乐,甚至不会产生更好的决策。心理学家Barry Schwartz称之为“选择悖论”。云计算为...

linux-tao ⋅ 58分钟前 ⋅ 0

Redis 注册为 Windows 服务

Redis 注册为 Windows 服务 redis 注册为 windows 服务相关命令 注册服务 redis-server.exe –service-install redis.windows.conf 删除服务 redis-server –service-uninstall 启动服务 re......

Os_yxguang ⋅ 59分钟前 ⋅ 0

世界那么大,语言那么多,为什么选择Micropython,它的优势在哪?

最近国内MicroPython风靡程序界,是什么原因导致它这么火呢?是因为他功能强大,遵循Mit协议开源么? 错!因为使用它真的是太舒服了!!! Micropython的由来,这得益于Damien George这位伟大...

bodasisiter ⋅ 今天 ⋅ 0

docker 清理总结

杀死所有正在运行的容器 docker kill $(docker ps -a -q) 删除所有已经停止的容器(docker rm没有加-f参数,运行中的容器不会删掉) docker rm $(docker ps -a -q) 删除所有未打 dangling 标...

vvx1024 ⋅ 今天 ⋅ 0

关于学习

以前学车的时候,教练说了这样的一句话:如果一个人坐在车上一直学,一直学,反而不如大家轮流着学。因为一个人一直学,就没有给自己留空间来反思和改进。而轮流着学的时候大家下来之后思考上...

mskk ⋅ 今天 ⋅ 0

压缩工具之gzip-bzip2-xz

win下常见压缩工具:rar zip 7z linux下常见压缩工具:zip gz bz2 xz tar.gz tar.bz2 tar.xz gzip 不支持目录压缩 gzip 1.txt #压缩。执行后1.txt消失,生成1.txt.gz压缩文件 gzip -d 1.txt....

ZHENG-JY ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部