zoukankan      html  css  js  c++  java
  • 小功能程序关联的用户切换

    1.实现一个功能,如果程序由root启动运行,将新建一个用户TEST,并将程序设置为TEST 用户权限运行 

    主要是通过getpwnam 和setuid函数,进行....

    struct passwd *ptPasswd = NULL;

    ptPasswd = getpwnam(NEW_USER_NAME);
    if(NULL == ptPasswd)
    {
    return FALSE;
    }
    if(0 != setuid(ptPasswd->pw_uid))

    实现方式看似简单,其实用到了用户知识,共有三个uid,

    #ps -ef    第一列显示的是UID ,即程序被该 UID 所拥有 

    扩展学习:

    三个UID,即用户ID, 实际生效ID,保存的设置用户ID

    在讨论这个setuid函数之前,我们首先要了解三个ID :
    内核为每个进程维护的三个UID值。这三个UID分别是 实际用户ID(real uid)、有效用户ID(effective uid)、保存的设置用户ID(saved set-user-ID)。

      首先说这个实际用户ID,就是我们当前以哪个用户登录了,我们运行的程序的实际用户ID就是这个用户的ID。有效用户ID就是当前进程是以哪个用户ID来运行的,一般情况下是实际用户ID,如果可执行文件具有了SUID权限,那么它的有效用户ID就是可执行文件的拥有者。保存的设置用户ID就是有效用户ID的一个副本,与SUID权限有关。

      关于那个SUID,最经典的例子莫过于passwd命令。passwd这个可执行文件的所有者是root,但是其他用户对于它也有执行权限,并且它自身具有SUID权限。那么当其他用户来执行passwd这个可执行文件的时候,产生的进程的就是以root用户的ID来运行的

    setuid(tetid);

    1.如果进程有超级用户特权,那么把三个ID都设置为testID

    2,如果没有超级特权,那么tetid等于实际用户ID 或者保存设置的ID ,那么把 有效ID设置为 tetID,

    若不满足1,2 ,报错。

    获取三个Uid函数getresuid
    其他getpwnam,getpwuid 通过name或者uid获取到信息 ...
    涉及到suid权限,如果运行程序有suid权限,那么 有效uid就设置为可执行文件的所有者。

    奋斗为了更好的生活。
  • 相关阅读:
    最短路-dij
    链式前向星
    B树、B+树
    C++类
    差分约束
    数位DP
    Markdown编辑器:表格
    git使用笔记
    leetcode 162. 寻找峰值(二分)
    python matplotlib包的安装注意事项:报错——No such file or dir : tmp/matplotlib-xxxxxx
  • 原文地址:https://www.cnblogs.com/redman274/p/15559439.html
Copyright © 2011-2022 走看看