Linux基础:用户身份与进程权限

一、基本概念

权限

  定义了用户对资源的访问能力。

用户:  

  对于多用户多任务的Linux操作系统来说,是通过什么来区分不同的使用者呢? 用户:用户就是获取资源或服务的凭证。当我们登录系统的时候,系统会提示输入用户名和密码进行登录验证。对于Linux系统来说,用户通常就是一个标识,以 UID 来表示。

进程

  程序的执行过程。所谓对计算机的操作,比如双击某个应用程序图标或者是通过命令提示符敲入命令,其最终产生的结果就是创建进程。看似用户的操作,实际上是进程在代替我们完成,进程就是我们访问计算机资源的代理

  比如:打开word,就是创建一个WINWORD.EXE进程。

技术分享

  执行 tail -f 命令,就是创建一个tail进程。

技术分享


进程权限

  当我们需要访问资源的时候,必须给相应的进程赋予权限。也就是说进程必须要携带发起这个进程用户的身份信息,进程也是有属主和属组的。

  当Linux完成开机启动之后,init进程会执行一个login的子进程。我们将用户名和密码传递给login子进程。login在查询了/etc/passwd/etc/shadow,并确定了其合法性之后,运行(利用exec)一个shell进程,shell进程有效身份被设置成为该用户的身份。由于此后fork此shell进程的子进程都会继承有效身份。


引用《Advanced Programming in the UNIX Environment - Second Edition

技术分享

技术分享

技术分享




二、Linux创建进程的机制

预备知识

技术分享

  实际上,当计算机开机的时候,内核(kernel)只建立了一个init进程。Linux kernel并不提供直接建立新进程的系统调用。剩下的所有进程都是init进程通过fork机制建立的。新的进程要通过老的进程复制自身得到,这就是fork。fork是一个系统调用。进程存活于内存中。每个进程都在内存中分配有属于自己的一片空间 (address space)。当进程fork的时候,Linux在内存中开辟出一片新的内存空间给新的进程,并将老的进程空间中的内容复制到新的空间中,此后两个进程同时运行。

  老进程成为新进程的父进程(parent process),而相应的,新进程就是老的进程的子进程(child process)。一个进程除了有一个PID之外,还会有一个PPID(parent PID)来存储的父进程PID。如果我们循着PPID不断向上追溯的话,总会发现其源头是init进程。所以说,所有的进程也构成一个以init为根的树状结构。


第一步:fork():复制进程映像

第二步:exec 系列函数:替换进程映像

技术分享

三、外部命令的执行机制

外部命令就是由Shell副本(新的进程)所执行的命令,基本的过程如下:
a. shell通过
fork()建立一个新的进程。此进程即为当前Shell的一个副本。
b. 在新的进程里,在
PATH变量内所列出的目录中,寻找特定的命令。
  当命令名称包含有斜杠(/)符号时,将略过路径查找步骤。
c. 在新的进程里,通过 
exec 系列函数,以所找到的新程序取代执行中的Shell进程并执行。
d. 子进程退出后,最初的Shell会接着从终端读取下一条命令,和执行脚本里的下一条命令。


  假设我们在shell中执行 cat a.txt 命令,其过程可以描述如下:

技术分享

结合上述的访问权限,我们来分析一下整个过程。

使用ls -l 命令查看文件的权限。

[skypegnu@skype ~]$ id
uid=500(skypegnu) gid=500(skypegnu) groups=500(skypegnu) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

[skypegnu@skype ~]$ ls -l /bin/cat
-rwxr-xr-x. 1 root root 45224 Nov 22  2013 /bin/cat
[skypegnu@skype ~]$ ls -l a.txt
-rw-rw-r--. 1 skypegnu skypegnu 7259 Mar 21 01:31 a.txt

我们可以看出,skypegnu用户real UID, real GID 为500。

技术分享

  当我们执行一个进程的时候,进程的Effective user ID 等于 real user ID, 进程的Effective group ID 等于 real group IDcat进程的EUID 等于 a.txt文件owner的ID,所以cat进程拥有对此文件的 rw- 权限,那么自然就可以访问a.txt的文件内容了。

cat进程               skypegnu  skypegnu

a.txt  -rw-rw-r--.  skypegnu  skypegnu



本文出自 “Share your knowledge” 博客,请务必保留此出处http://skypegnu1.blog.51cto.com/8991766/1622707

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。