5.1 权限在目录与文件应用上的意义
本文基于centos7系统
权限对文件的重要性:
文件是实际含有信息或数据的"容器"
- r (read) : 可以读取此文件的实际内容
- w (write) : 可以编辑,添加或者修改该文件的内容(但不含删除该文件)
- x (eXecute) : 该文件具有可执行的权限(但是可不可以执行要看文件是否具备可执行的功能)
- 对于文件的rwx权限来说,主要是对"文件的内容"而言,与文件名没有关系
权限对目录的重要性:
文件是存放实际数据的"容器",目录里面主要是记录文件名列表
-
r (read contents in directory, 可读取目录的内容)
表示具有读取目录结构列表的权限, 所以当用户具有读取®一个目录权限是,表示该用户可以查询该目录下的文件名
-
w (modify contents of directory, 修改目录的内容)
表示用户具有修改该目录结构列表的权限,即:
- 创建新的文件与目录
- 删除已经存在的文件与目录(无论该文件本身的权限)
- 将已经存在的文件或目录进行更名
- 变更该目录内的文件和目录存储的位置
-
x (access directory, 可访问目录)
代表的是用户能否进入该目录并作为当前的工作目录
组件 | 内容 | 思考对象 | r | w | x |
---|---|---|---|---|---|
文件 | 详细内容 | 文件 | 读取文件内容 | 修改文件内容 | 执行文件 |
目录 | 文件名 | 可分类档案室 | 读取文件名 | 修改文件名 | 进入该目录的权限 |
5.2 进程管理初探
所有在系统上运行的程序都是通过触发程序成为内存中的进程后才能够顺利运行
- 程序(program) : 通常是指二进制程序(binary program),存放在存储媒体中,以实体文件的形式存在
- 进程(process) : 进程被触发后,执行者的权限与属性,程序的程序代码与所需数据等都会被加载到内存中,操作系统给予这个内存中的单元一个标识符(PID,进程标识符),进程就是一个正在运行中的程序
进程是有相关性的,进程的调用进程是父进程,自己是子进程
进程查看的几个命令:
-
ps -l : 只查看bash自己相关的进程
- F(flag) : 代表进程的摘要标志,4代表root
- S(stat) : 状态栏
- R(running) : 该进程正在运行
- S(sleep) : 该进程当前正在睡眠状态,但可以被唤醒(signal)
- D: 不可被唤醒的睡眠状态,如等待I/O
- T: 停止状态(stop) , 可能是在工作控制(后台暂停)或追踪错误(traced)状态
- Z (Zombie) : 僵尸状态,进程已经终止却无法从内存中移出
- UID/PID/PPID : 分别代表进程拥有者 / 进程的PID号码 / 此进程父进程的PID号码
- C : 代表CPU使用率
- PRI/NI : Priority / Nice 的缩写, 代表此进程被CPU所执行的优先级,数值越小代表该进程越快被CPU执行
- ADDR/SZ/WCHAN : ADDR是kernel function,指出进程在内存的哪个部分,如果是一个正在(running)的进程,一般会显示"-" / SZ代表此进程占用多少内存 / WCHAN 代表当前进程是否在运行,"-"代表正在运行
- TTY : 登录者"终端位置", 若为远程登录则使用动态终端端口(pts/n)
- TIME: 已实际使用CPU的时间
- CMD : command的缩写,触发此进程的命令是什么
[parallels@centos-7 ~]$ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 R 1000 9847 30553 0 80 0 - 37227 - pts/0 00:00:00 ps 0 S 1000 30553 30546 0 80 0 - 29125 do_wai pts/0 00:00:00 bash
使用pstree与ps aux查看整个系统的进程:
进程关系树pstree,-A选项表示以ASCII字符方式显示,若需要加上PID与用户信息,加入-up选项, 当父进程,子进程的所有者不同时,在程序名称后面才会加上用户的信息,否则会省略用户的名称
[parallels@centos-7 ~]$ pstree -Aup
systemd(1)-+-ModemManager(709)-+-{ModemManager}(734)
| `-{ModemManager}(752)
|-NetworkManager(1108)-+-dhclient(9606)
| |-{NetworkManager}(1116)
| `-{NetworkManager}(1121)
ps可以将系统中的进程调出来,且输出的信息很丰富
- USER : 进程属于哪个用户账号
- PID : 进程的进程标识符
- %CPU : 进程所占用的CPU资源百分比
- %MEN : 进程所占用的物理内存百分比
- VSZ: 占用的虚拟内存量(KB)
- RSS : 占用的固定内存量(KB)
- STAT : 与ps -l相同(R/S/T/Z)
- START : 被触发启动的时间
- TIME : 实际使用CPU运行的时间
- COMMAND : 实际命令是什么
[parallels@centos-7 ~]$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 193704 5004 ? Ss Oct27 0:16 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root 2 0.0 0.0 0 0 ? S Oct27 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S Oct27 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< Oct27 0:00 [kworker/0:0H]
top动态查看进程
[parallels@centos-7 ~]$ top
top - 00:32:46 up 9:55, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 211 total, 7 running, 204 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.2 us, 1.7 sy, 0.0 ni, 96.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1879452 total, 95176 free, 749748 used, 1034528 buff/cache
KiB Swap: 2097148 total, 2085472 free, 11676 used. 886260 avail Mem
进程的优先级PRI与NI:
PRI越低系统越会优先执行该进程,同一个周期内被执行更多次,但是PRI是系统规划的,用户不能设置,但是Nice(NI)值是可以设置的
PRI(new) == PRI(old) + NI
由此,NI越小,PRI越小,进程的优先级越高,nice 和 renice 命令 或 top命令都可调整
NI可调整的范围为-20~19 , root可以随意调整自己或他人进程的NI值
普通用户只能调整自己的进程NI值,范围为0~19,且只能越调越高
bash的作业控制:
作业控制(job control)是用在bash环境下的
只能触发用户当前shell的子进程
前台(foreground)是用户下达命令的这个环境
后台是可以自行运行的作业,用户无法ctrl + c 终止它,可使用bg/fg调用
后台中"执行"的进程不能等待terminal/shell的输入(input)
- command & : 直接将command置于后台中执行,如有输出,最好使用数据流重定向输出到其他文件中
- ctrl + z : 将当前正在前台中的作业置于后台中暂停
- jobs [-l] : 列出当前的作业信息
- fg %n : 将第n个在后台的作业移动到前台来操作
- bg %n : 将第n个在前台的作业移到后台中
5.3 特殊权限 SUID/SGID/SBIT 的功能
SUID的功能和查看:
系统的密码记录在/etc/shadow内,但是这个文件的权限是———,此时Linux使用SetUID(SUID)的技术来解决用户修改密码的问题,系统设置一个SUID的权限标志到passwd执行文件上,当用户执行passwd命令时,就能够借助SUID来切换执行权限
- SUID权限仅对二进制程序有效
- 执行者对于该程序需要具有x的可执行权限
- 本权限仅在执行该程序的过程中有效
- 执行者将具有该程序所有者(owner)的权限
[parallels@centos-7 ~]$ ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd
可以发现passwd的执行权限是s,即SUID, passwd设置了SUID,且passwd的所有者是root,因此只要任何人有x的执行权,当用户执行passwd时,就会自动通过SUID转换身份称为owner,即变成了root的身份
SGID的功能与查看:
SGID为将特殊的权限标志设置在群组的x上
- SGID对二进制程序有用
- 程序执行者对于进程来说,需具备x的权限
- 执行者在执行的过程中将会获得该程序群组的支持!
[parallels@centos-7 ~]$ ll -d /var/lib/mlocate/
drwxr-x---. 2 root slocate 24 10月 26 00:17 /var/lib/mlocate/
[parallels@centos-7 ~]$ which locate
/usr/bin/locate
[parallels@centos-7 ~]$ ll -d /usr/bin/locate
-rwx--s--x. 1 root slocate 40512 11月 5 2016 /usr/bin/locate
//发现其他用户可以locate命令进入mlocate目录
SGID也可设置与目录上:
- 用户若对此目录具有r与x的权限,该用户可以进入此目录
- 用户在此目录下的有效群组(effective group)将会变成该目录的群组
- 用途: 若用户在此目录下具有w的权限(可以新建文件),则用户所创建的新文件群组与此目录的群组相同
SBIT的功能和查看:
- 当用户对此目录具有w和x权限,即具有写入的权限
- 当用户在此目录下创建文件或目录时,只有自己与root才有权利删除该文件
SUID/SGID/SBIT权限的设置:
4为SUID
2为SGID
1位SBIT
[root@centos-7 ~]# ll -d /usr/bin/passwd /usr/bin/locate /tmp
drwxrwxrwt. 16 root root 4096 Oct 28 02:50 /tmp
-rwx--s--x. 1 root slocate 40512 Nov 5 2016 /usr/bin/locate
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
有s或t存在时,该字段需要加入x的权限;
/tmp 的传统权限是"drwxrwxrwx"(777),外加一个SBIT,即"1777";
/usr/bin/locate 的传统权限是"711",外加一个SGID,即"2711";
/usr/bin/passwd的传统权限是"755",外加一个SUID,即"4755";
符号法:
SUID : chmod u+s filename
SGID : chmod g+s filename
SBIT : chmod o+t filename