每一个进程都有一个实际用户标识符和一个实际组标识符,它们永远是启动该进程之用户的用户标识符和组标识符。

进程有效用户标识符有效组标识符或许更重要些,它们被用来确定一个用户是否能訪问某个确定的文件。在通常情况下,它们与实际用户标识符和实际组标识符是一致的。

有几个系统调用能够用来得到进程的用户标识符和组标识符,详见下列程序:



/* 取进程的实际用户标识符 */

        uid=getuid();

/* 取进程的有效用户标识符 */

       euid=geteuid();

/* 取进程的实际组标识符 */

      gid=getgid();

/* 取进程的有效组标识符 */

      egid=getegid();

另外,还有两个系统调用能够用来设置进程的有效用户标识符和有效组标识符,它们的使用格式例如以下:

/* 设定进程的有效用户标识符 */

      status=setuid(newuid);

/* 设定进程的有效组标识符 */

      status=setgid(newid)

通过这两个系统调用。进程能够改变自己的标识符,进而改变自己的权限(由于Linux中权限是通过标识符来推断的)。

比方一个root 建立的进程能够用这样的方法放弃一部分的root 权限而仅仅保留工作所需的权限。

这样能够提高系统的安全性。

<span style="font-size:14px;">#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<fcntl.h>
#include<stdlib.h> int main(int argc,char* argv[])
{
int fd;
fd = fork();
switch(fd){
case -1:{
perror("fork");
exit(-1);
}
break;
case 0:
{ //開始进程用户id和有效用户id
printf("uid=%d,euid=%d\n",getuid(),geteuid()); //设置用户id为1000。改变用户权限
setuid(1000); //改变后的用户id和有效用户id
printf("uid=%d,euid=%d\n",getuid(),geteuid()); //root用户才干查看shadow文件,測试权限是否改变
execlp("cat","cat","/etc/shadow",NULL);
}
break;
default:
{ //開始进程用户id和有效用户id
printf("uid=%d,euid=%d\n",getuid(),geteuid());
//root用户才干查看shadow文件
execlp("cat","cat","/etc/shadow",NULL);
}
break;
} return 0;
}
</span>

在root权限下执行结果:

[root@embedclub file]# ./a.out

        uid=0,euid=0

        uid=1000,euid=1000

        cat: /etc/shadow: 权限不够

        uid=0,euid=0

      root:$$MG0tTs8yWCPoKMrG$tVrZQKQ6IK52ucaSGfHIMKdVHB7zP.rpqD5GO/1w07eYQj0Jgue9S/UijUtyYYQa9Irm2vwj7r.DwaY.5IXIp0:15195:0:99999:7:::

        bin:*:14789:0:99999:7:::

可是须要注意的是,一旦root 进程通过这样的方式放弃了root 特权,将无法再通过setuid()调用的方式又一次获得root权,由于一个非root 标识符的进程是无法设定root 标识符的。这时能够使用Linux 的另外两个系统调用seteuid()和setegid()。其调用方式和前两个全然同样。可是它们是依据进程程序文件的标识符来推断设定的。因此,一个root 的程序文件在不论什么时候都能够将自己又一次seteuid()为root。

<span style="font-size:14px;">#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<fcntl.h>
#include<stdlib.h> int main(int argc,char* argv[]){ //開始进程用户id和有效用户id
printf("uid=%d,euid=%d\n",getuid(),geteuid()); //设置用户id为1000。改变用户权限
setuid(1000); //改变后的用户id和有效用户id
printf("uid=%d,euid=%d\n",getuid(),geteuid()); //设置用户id为0,改变用户权限为root
if(-1 == setuid(0)){
perror("setuid to root");
exit(-1);
}
//改变后的用户id和有效用户id
printf("uid=%d,euid=%d\n",getuid(),geteuid()); return 0;
}
</span>

root下执行结果:

[root@embedclub file]# ./a.out

uid=0,euid=0

uid=1000,euid=1000

setuid to root: Operation not permitted

<span style="font-size:14px;">#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<fcntl.h>
#include<stdlib.h> int main(int argc,char* argv[]){ //開始进程用户id和有效用户id
printf("uid=%d,euid=%d\n",getuid(),geteuid()); //设置用户id为1000。改变用户权限
setuid(1000); //改变后的用户id和有效用户id
printf("uid=%d,euid=%d\n",getuid(),geteuid()); //设置用户id为1000,改变用户权限为自己
if(-1 == setuid(1000)){
perror("setuid to root");
exit(-1);
}
//改变后的用户id和有效用户id
printf("uid=%d,euid=%d\n",getuid(),geteuid()); return 0;
}</span>

执行结果:

以上样例说明不是超级用户所引用的进程,仅仅能把它的有效用户表示符和有效组标识符又一次设置成事实上际用户标识符和实际组标识符。

超级用户所引用的进程就能够自由进行其有效用户标识符和有效组标识符的设置。

以上使用setuid()永久改变权限。如今使用seteuid()临时改变用户权限:

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<fcntl.h>
#include<stdlib.h> int main(int argc,char* argv[]){ //開始进程用户id和有效用户id
printf("uid=%d,euid=%d\n",getuid(),geteuid()); //设置有效用户id为1000。临时改变用户权限
seteuid(1000); //改变后的用户id和有效用户id
printf("uid=%d,euid=%d\n",getuid(),geteuid()); //设置有效用户id为0,改变用户权限为自己
if(-1 == setuid(0)){
perror("setuid to root");
exit(-1);
}
//改变后的用户id和有效用户id
printf("uid=%d,euid=%d\n",getuid(),geteuid()); return 0;
}

执行结果:

#./a.out

uid=0,euid=0

uid=0,euid=1000

uid=0,euid=0

[root@embedclub file]# ./a.out

uid=0,euid=0

uid=0,euid=1000

uid=0,euid=0[root@embedclub
file]# ./a.out

uid=0,euid=0

uid=0,euid=1000

uid=0,euid=0

[root@embedclub file]# ./a.out

uid=0,euid=0

uid=1000,euid=1000

uid=1000,euid=1000[root@embedclub file]# ./a.out

uid=0,euid=0

uid=1000,euid=1000

uid=1000,euid=1000[root@embedclub file]# ./a.out

uid=0,euid=0

uid=1000,euid=1000

uid=1000,euid=1000[root@embedclub file]# ./a.out

uid=0,euid=0

uid=1000,euid=1000

uid=1000,euid=1000[root@embedclub file]# ./a.out

uid=0,euid=0

uid=1000,euid=1000

uid=1000,euid=1000

linux进程标识符具体解释1的更多相关文章

  1. Linux进程管理知识整理

    Linux进程管理知识整理 1.进程有哪些状态?什么是进程的可中断等待状态?进程退出后为什么要等待调度器删除其task_struct结构?进程的退出状态有哪些? TASK_RUNNING(可运行状态) ...

  2. linux进程模型总结

    Linux进程通过一个task_struct结构体描述,在linux/sched.h中定义,通过理解该结构,可更清楚的理解linux进程模型.       包含进程所有信息的task_struct数据 ...

  3. Linux 进程与信号的概念和操作

    进程 主要参考: http://www.bogotobogo.com/Linux/linux_process_and_signals.php 信号与进程几乎控制了操作系统的每个任务. 在shell中输 ...

  4. Linux进程模型

    ----原文链接:http://www.cnblogs.com/biyeymyhjob/archive/2012/08/01/2617884.html------ Linux进程通过一个task_st ...

  5. 第9章 Linux进程和信号超详细分析

    9.1 进程简单说明 进程是一个非常复杂的概念,涉及的内容也非常非常多.在这一小节所列出内容,已经是我极度简化后的内容了,应该尽可能都理解下来,我觉得这些理论比如何使用命令来查看状态更重要,而且不明白 ...

  6. linux进程原语之fork()

    一.用法解析: fork()这个函数,可以说是名如其人了,众所周知fork这个单词本意为叉子,老外取学术名字的时候总会有一些象形的想法,于是就有了下图~ fork()函数是计算机程序设计中的分叉函数. ...

  7. Linux 进程资源用量监控和按用户设置进程限制

    每个 Linux 系统管理员都应该知道如何验证硬件.资源和主要进程的完整性和可用性.另外,基于每个用户设置资源限制也是其中一项必备技能. 在这篇文章中,我们会介绍一些能够确保系统硬件和软件正常工作的方 ...

  8. Linux 进程与信号的概念和操作 linux process and signals

    进程 主要参考: http://www.bogotobogo.com/Linux/linux_process_and_signals.php 译者:李秋豪 信号与进程几乎控制了操作系统的每个任务. 在 ...

  9. Linux 进程必知必会

    上一篇文章只是简单的描述了一下 Linux 基本概念,通过几个例子来说明 Linux 基本应用程序,然后以 Linux 基本内核构造来结尾.那么本篇文章我们就深入理解一下 Linux 内核来理解 Li ...

随机推荐

  1. 常用meta整理[转载]

    < meta > 元素 概要 标签提供关于HTML文档的元数据.元数据不会显示在页面上,但是对于机器是可读的.它可用于浏览器(如何显示内容或重新加载页面),搜索引擎(关键词),或其他web ...

  2. VUE插件-图片濑加载

    1.  cnpm install vue-lazyload 2.main.js import  vue-lazyload from  'vue-lazyload' Vue.use(vue-lazylo ...

  3. 学Java的前景与就业,资深程序员教你怎么开始学Java!

    IT行业一直是就业的热门岗位,程序员这个职业稳定性和收入比都有着不错的前景,那么学Java的前景和就业是什么样的呢?随着入行Java的准程序员越来越多,各种学习Java的流派也层出不穷!其实在编程的世 ...

  4. c#工厂模式与抽象工厂模式

    一. 工厂方法(Factory Method)模式 工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中. 工厂方法模式是简单工 ...

  5. SHA1 安全哈希算法(Secure Hash Algorithm)

    安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准 (Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signatu ...

  6. 【SpringMVC】使用Myeclipse创建SpringMVC项目【超详细教程】

    之前一直是使用Eclipse创建Web项目,用IDEA和MyEclipse的创建SpringMVC项目的时候时不时会遇到一些问题,这里把这个过程记录一下,希望能帮助到那些有需要的朋友.我是用的是MyE ...

  7. vscode调试html页面,及配置说明

    一.效果目的 1.在VSCode里,直接F5打开html页面,并且可以在编辑器里,进行断点调试js代码: 二.工具准备 1.VSCode 软件 2.一个js项目 3.VSCode 上装一个插件:Deb ...

  8. h5前端流行的框架

    很多时候别人问你,上手的框架有哪些,其实我们都是知道的,只是一时却也说不上哪些比较,这里想给大家介绍一下,我所遇到的,还算好用的框架,做个分享 1 Bootstrap 官网:http://getboo ...

  9. OCPC(Optimized Cost per Click)机制

    背景 在线广告中,广告按照CPM排序,排在前面的广告竞争有限广告位(截断).其中,CPM=bid*pctr.注GSP二价计费的,按照下一位bid计费.适当调整bid,可以提高竞价的排名,从而获得展现的 ...

  10. JavaScript--我发现,原来你是这样的JS:函数表达式和闭包

    一.介绍 本次博客主要介绍函数表达式的内容,主要是闭包. 二.函数表达式 定义函数的两种方式:一个是函数声明,另一个就是函数表达式. //1.函数声明写法 function fn2(){ consol ...