在linux下,关于文件权限,大部分人接触比较多,也比较熟悉了解.但是对进程权限一般知之甚少。本文总结一下linux系统下进程权限问题和现象。

需要强调的是,本文是linux系统下讨论,因为linux和unix有很多不同的地方,并且各个不同的unix系统也有很多不同。

先开门见山的列出本文讨论对象:ruid(实际用户id: real userid)、euid(有效用户用户:effective userid), suid(保存用户id:saved userid)、fuid(文件系统用户id)。

除了上面4个,还涉及到一个位 设置用户id位(set user id bit),,即我们通常所说的处rwx之外那个s标志位。

另外,本文主要讨论userid,groupid规则基本一样,例如rgid, egid, sgid, fgid等,本文就不做组id方面的重复讨论了。

首先,查看这几个uid的方法有两种方式:一是ps 命令 (ps -ax -o ruid -o euid -o suid -o fuid -o pid -o fname)列出这几个uid;二是查看status文件,(cat /proc/2495/status | grep Uid)。

本文创建5个test用户 test1~test5用来做本文中sample讨论使用,代表常见普通权限用户。

一:文件所有者用户和程序执行者用户是同一用户的情况

int main(int argc, char *argv[])

{

while(1)sleep(1);

}

$>g++ main.cpp -o a.out

$>ll

-rwxr-xr-x. 1 test1 test 6780 Sep 16 15:32 a.out

文件所有者是test1,我们用test1用户执行a.out程序

$>su test1

$>./a.out &

$>ps -ax -o ruid -o euid -o suid -o fuid -o pid -o fname | grep a.out

502   502   502   502  3192 a.out

(看到结果是4个uid全是test1;)

现在我们用test2用户执行test1的程序看看结果

$su test2

503   503   503   503  3234 a.out

再用root用户执行

0     0     0     0  3257 a.out

看到这个结果,我们基本可以总结:

在常见情况下。这四个id只受执行用户影响,不受文件owner用户影响。并且四个uid全部等于执行用户的id;

上面是我们碰到最常见最多的情况,所以导致大部分技术人员很少关心这个四个uid的区别和含义。让我们继续看看更多场景

二、出让权限给其它用户。非root用户是无法出让权限给其它用户,只有root用户才能出让。

int main(int argc, char *argv[])

{

if( setuid(503) < 0) perror ("setuid error");

while(1)sleep(1);

}

$>ll

-rwxr-xr-x. 1 test1 test 6780 Sep 16 15:32 a.out

使用root用户执行

$>./a.out

查看状态,所有uid都变成test2用户。

503   503   503   503  3592 a.out

把代码中setuid改成seteuid函数,会把euid和fuid改成test2用户

0   503     0   503  3614 a.out

把代码中setuid改成setfsuid函数,会把fuid改成test2用户

0     0     0   503  3636 a.out

当把代码改成下面样子

if( seteuid(503) < 0) perror ("seteuid error");

if( setfsuid(504) < 0) perror ("setfsuid error");

while(1)sleep(1);

或者

if( setfsuid(504) < 0) perror ("setfsuid error");

if( setfeuid(503) < 0) perror ("seteuid error");

while(1)sleep(1);

用root用户执行,得到都是一样的结果

0   503     0   503  3614 a.out

到了这里我来总结一下:1、setuid和seteuid是有区别的,setuid是永久的放弃root用户权限,转让给非root用户后,

无法再restore到root用户,seteuid是临时放弃root用户权限,可以通过seteuid(0),restore到root权限。

这点应该是总所周知的特点,本文就不举例子演示。

2、seteuid 会同时改变euid和fuid都为设置的euid值。

3、root用户可以通过调用setxxuid 来改变权限用户。非root用户是无法改变和转让权限用户。

权限出让使用最多的场景是类似apache或mysql程序,启动的时候使用root用户启动,设置一些root用户才能操作的系统配置。创建子进程时候通过setuid降级为nobody用户。

继续看一下s权限位对进程权限的影响

三、s 标志位影响的是 euid,suid,和 fuid

int main(int argc, char *argv[])

{

while(1)sleep(1);

}

$>g++ main.cpp

$>ll

-rwxr-xr-x. 1 test1 test 6780 Sep 16 18:18 a.out

$>chmod u+s a.out

$>ll

-rwsr-xr-x. 1 test1 test 6780 Sep 16 18:18 a.out

使用root用户执行,查看用户ID为

0   502   502   502  4133 a.out

s权限位使用最经典的案例是passwd命令

下面我们看看他们对文件权限的影响,构建一个ruid,euid,和fuid都不同,看看创建出来的文件所有者是哪个uid

四、影响用户文件权限的是 fuid,不是 euid,该 uid 是 linux 特有的属性,unix 系统是靠 euid 来判定用户权限。

int main(int argc, char *argv[])

{

if( setfsuid(503) < 0) perror ("setfsuid error");

FILE * fp = fopen("test.log", "a+");

if(fp == NULL)

{

perror ("fopen error");

}

else

{

fclose(fp);

}

while(1)sleep(1);

}

使用s权限位,文件所有者为root,执行者为test1,改变fuid为test2,这样就构造出3个uid各部相同,方便观察效果

$>ll

-rws---r-x. 1 root  root  7397 Sep 16 18:53 a.out

运行查看状态,ruid为test1,euid为root,fuid为test2

502     0     0   503  4240 a.out

$>ll

-rws---r-x. 1 root  root  7397 Sep 16 18:53 a.out

-rw-rw-r--. 1 test2 test    0 Sep 16 18:54 test.log

五、权限的继承,当使用 fork 子进程的时候,子进程全部继承父进程四个 uid,和父进程 uid 相同

当使用exec系列函数时候,会把suid置为euid。

linux下测试权限,Linux下进程权限分析相关推荐

  1. linux java测试工具_Linux下Java虚拟机状态监测工具

    Linux下Java虚拟机状态检测工具 工具名称: jps     JVM Process Status Tool - Lists instrumented HotSpot Java virtual ...

  2. 写linux程序测试吞吐量,Linux下测试磁盘性能(IO、吞吐量)

    使用软件:fio,可以从yum或apt-get安装 1.随机读 fio -filename=testFile -direct=1 -iodepth 1 -thread -rw=randread -io ...

  3. 模拟linux终端测试java,Linux 伪终端(pty)

    通过<Linux 终端(TTY)>一文我们了解到:我们常说的终端分为终端 tty1-6 和伪终端.使用 tty1-6 的情况一般为 Linux 系统直接连了键盘和显示器,或者是使用了 vS ...

  4. linux进程文件描述符 vnode,Linux C编程详解:进程原理分析、文件描述符和文件记录表、文件句柄和文件原理...

    一.引言 文件操作是Linux C编程中其中的一项核心技术,实际上也相当重要,这里并不是说狭义上的那种文件操作,它也非常有助于理解和学习Linux系统.为什么这样说呢?因为在Unix/Linux的世界 ...

  5. linux 多点触摸屏测试,c – Linux中的多点触控

    您可以直接调用qt_translateRawTouchEvent来模拟触摸事件. (此方法未记录,但它在qapplication.cpp中并且已导出). 您想将它放在文件的顶部: // forward ...

  6. linux怎样测试tty,linux – 提示自定义:如何检测何时没有tty

    我有一个带颜色的自定义提示符(使用tput),每次我在服务器中启动非交互式会话时,都会出现一堆错误. 例如,如果我开始这样的非交互式会话: ssh root@hostname6 "echo ...

  7. Linux串口测试工具

    Linux串口测试工具 Windows 下的串口工具非常多,Linux下的串口工具相对较少,有时候要调试给定串口通信可靠性,则需要搜索一圈才能找到易用方便且满足自己的需求的工具. 无意中发现 linu ...

  8. 【Linux系统编程】 Linux系统调用概述

    系统调用概述 系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组"特殊"接口.用户程序可以通过这组"特殊"接口来获得操作系统内核提供的服务,比如用户可以 ...

  9. 修改linux ftp共享目录权限,linux系统下修改文件夹目录权限

    文件夹权限问题 Linux.Fedora.Ubuntu修改文件.文件夹权限的方法差不多.很多人开始接触Linux时都很头痛Linux的文件权限问题.这里告诉大家如何修改Linux文件-文件夹权限.以主 ...

最新文章

  1. 游戏开发随想之2D游戏架构
  2. Autofac - 属性注入
  3. SMS短信通API——(1)Java应用发送手机短信
  4. 玩转Android之加速度传感器的使用,模仿微信摇一摇
  5. [Javascript]XMLHttpRequest对象实现下载进度条
  6. 梦幻一场——关于《梦断代码》
  7. 区块链教程Fabric1.0源代码分析flogging(Fabric日志系统)
  8. Web表单提交之disabled问题
  9. 黑马程序员c++讲义课件笔记
  10. 离职前一定要做好这7件事情,少一件都很麻烦。
  11. 也谈企业文化—执行力
  12. 超好用的在线编程IDE——CS50
  13. HTML+js图片验证码编写
  14. Charles ios无法下载证书- chls.pro/ssl一直加载治标办法
  15. 【ChatGPT初体验与Android的集成使用】
  16. dya04 js_02
  17. 文件服务协议:cifs/nfs 简介
  18. win7 下MCR的安装以及环境变量配置
  19. MATLAB定态氢原子波函数可视化
  20. Mybatis Plus使用,条件拼装、自定义分页、多数据源

热门文章

  1. RPC系列:基本概念
  2. mysql5.1版本 my.cnf中复制的配置不起作用
  3. 读Zepto源码之代码结构
  4. Oracle中如何判断字符串是否全为数字
  5. 自己动手为Spark 2.x添加ALTER TABLE ADD COLUMNS语法支持
  6. python pass关键字神奇吗
  7. Android开发笔记1之HelloWorld
  8. 如何将spyder打包成exe_exe程序打包成安装文件,自己的程序制作成一键安装程序...
  9. Python使用集合运算检测密码字符串的安全强度
  10. 微课|中学生可以这样学Python(例11.1):tkinter电子时钟程序(2)