linux子程序标识符,linux过程标识符详解1
linux进程标识符详解1
每个进程都有一个实际用户标识符和一个实际组标识符,它们永远是启动该进程之用户的用户标识符和组标识符。
进程的有效用户标识符和有效组标识符也许更重要些,它们被用来确定一个用户能否访问某个确定的文件。在通常情况下,它们与实际用户标识符和实际组标识符是一致的。
有几个系统调用可以用来得到进程的用户标识符和组标识符,详见下列程序:/* 取进程的实际用户标识符 */
uid=getuid();
/* 取进程的有效用户标识符 */
euid=geteuid();
/* 取进程的实际组标识符 */
gid=getgid();
/* 取进程的有效组标识符 */
egid=getegid();
另外,还有两个系统调用可以用来设置进程的有效用户标识符和有效组标识符,它们的使用格式如下:/* 设定进程的有效用户标识符 */
status=setuid(newuid);
/* 设定进程的有效组标识符 */
status=setgid(newid)
通过这两个系统调用,进程可以改变自己的标识符,进而改变自己的权限(因为Linux中权限是通过标识符来判断的)。比如一个root 建立的进程可以用这种方法放弃一部分的root 权限而只保留工作所需的权限。这样可以提高系统的安全性。
#include
#include
#include
#include
#include
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;
}
在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。
#include
#include
#include
#include
#include
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;
}
root下运行结果:
[root@embedclub file]# ./a.out
uid=0,euid=0
uid=1000,euid=1000
setuid to root: Operation not permitted
#include
#include
#include
#include
#include
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;
}
运行结果:
以上例子说明不是超级用户所引用的进程,只能把它的有效用户表示符和有效组标识符重新设置成其实际用户标识符和实际组标识符。超级用户所引用的进程就可以自由进行其有效用户标识符和有效组标识符的设置。
以上使用setuid()永久改变权限,现在使用seteuid()暂时改变用户权限:
#include
#include
#include
#include
#include
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子程序标识符,linux过程标识符详解1相关推荐
- linux查看多核cpu运行状态,Linux下查看多核CPU信息详解
Linux系统下,CPU信息详解(cpuinfo,多核,多线程) 在Linux系统中,如何详细了解CPU的信息呢? 当然是通过cat /proc/cpuinfo来检查了,但是比如几个物理CPU/几核/ ...
- linux查看和结束进程,Linux查看和结束进程命令详解
在ubuntu中,终止一个进程或终止一个正在运行的程序,一般是通过 kill .killall.pkill.xkill 等进行. ----------------------------------- ...
- Linux系统中UID和GID详解
Linux系统中UID和GID详解 在Linux系统中,每个用户和组都有一个唯一的数字标识符,分别称为UID(用户ID)和GID(组ID).这些标识符用于在系统级别上对用户和组进行身份验证和授权,并且 ...
- 【Linux驱动开发】设备树详解(二)设备树语法详解
活动地址:CSDN21天学习挑战赛 [Linux驱动开发]设备树详解(一)设备树基础介绍 [Linux驱动开发]设备树详解(二)设备树语法详解 [Linux驱动开发]设备树详解(三)设备树Kern ...
- linux tf命令,Linux系统命令介绍之vmstat命令详解
今天小编要跟大家介绍的vmstat命令详解.熟悉Linux系统和使用Linux系统工作的小伙伴都知道Linux的命令有很多,而真正在工作中用到的命令应该不超过几十个,为了让大家更好的掌握这些命令,小编 ...
- linux mount命令参数及用法详解
linux mount命令参数及用法详解 非原创,主要来自 http://www.360doc.com/content/13/0608/14/12600778_291501907.shtml. htt ...
- linux 进程间通信 dbus-glib【实例】详解二(上) 消息和消息总线(附代码)
linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...
- linux cpio(copy in/out) 命令详解
linux cpio(copy in/out) 命令详解 功能说明:备份文件. 语 法:cpio [-0aABckLovV][-C <输入/输出大小>][-F <备份档>][- ...
- linux 的文件软链接隐藏,Linux inode及硬链接软链接详解
Linux inode及硬链接软链接详解 York • 2020 年 09 月 28 日 Loading... 操作系统的文件数据除了实际内容之外,通常含有非常多的属性,例如 `Linux`操作系统的 ...
- Linux下暴力破解工具Hydra详解
Linux下暴力破解工具Hydra详解 一.简介 Number one of the biggest security holes are passwords, as every password s ...
最新文章
- php叠加纹理,ps光斑纹理曝光视觉特效叠加合成扩展-ps光斑纹理叠加合成扩展 - 极光下载站...
- java常见的算法_Java常用算法总结(转)
- C++类的内联成员函数应放在哪
- [渝粤教育] 广东-国家-开放大学 21秋期末考试成本会计10168k2
- django web 自定义通用权限控制
- 为什么NX10帮助功能无法找到HTML,NX10.0 新功能介绍视频教程专辑
- 中微公司2020年净利4.92亿元 投资中芯国际赚2.62亿
- Linux 内核 5.4 将于 11月24 日 发布,Linux 5.4-rc8 已可用于公测
- php查询mysql数据库乱码_PHP怎样处理查询MySQL数据库中文乱码?_后端开发
- Java判断平台为32位或64位,载入对应DLL
- ~~朴素dijkstra算法 (搜索与图论)(附模板题AcWing 849. Dijkstra求最短路 I)
- 用三张图看透 I/O,学习区分同异步阻塞
- 独轮车(广搜_队列)
- RTTI、dynamic_cast、typeid、虚函数表
- 笔记本cpu排名_2020年双十一哪一款笔记本电脑值得买?高性价比笔记本电脑推荐(10月更新)...
- 升级openssh漏洞
- 【语音隐写】基于matlab LSB语音隐藏【含Matlab源码 431期】
- Ueditor编辑器修改字体和字号?
- 走进小作坊(十)----长尾效应
- 无人机航测技术及应用概述