Linux

Linux课堂笔记(3)

特殊权限:强制位(suid),冒险位(sgid),黏贴位(stick)


  • 设置特殊权限
a)	符号法:setuid=u+s;setgid=g+s;stick=o+t
b)	数值法:setuid=4;setgid=2;stick=1  如:chmod  2770 目录
  • 影响默认文件权限的因素
(1)	创建的是文件还是目录
(2)	使用的是root用户还是普通用户
(3)	新目录权限值0777;新文件权限制0666
(4)	umask值:限制初始设置的权限,清除创建的新文件和新目录的权限
(5)	root用户umask默认0022;普通用户umask值默认0002
(6)	umask值设置:xxxx;关闭终端,重新开启终端设置的新umask值失效
(7)	创建新文件权限 = 新文件权限制0666 - umask值 例如普通用户创建文件:0666 - 0002 = 0664
  • Bash shell 用户可以在用户主目录的~/.bashrc文件中覆盖系统默认值,重新登录终端生效
举例:echo “umask 0022” >>~/.bashrc

课堂练习


(1)	root用户创建3个新用户tech1,tech2,database1,密码redhat123和1个组sd
[root@localhost ~]# useradd tech1
[root@localhost ~]# useradd tech2
[root@localhost ~]# useradd database1
[root@localhost ~]# echo redhat123 | passwd --stdin tech1
[root@localhost ~]# echo redhat123 | passwd --stdin tech2
[root@localhost ~]# echo redhat123 | passwd --stdin database1
[root@localhost ~]# groupadd sd

(2)	root用户创建名为/home/sd的目录,且将/home/sd的所属组修改为sd
[root@localhost ~]# mkdir /home/sd
[root@localhost ~]# chown :sd /home/sd

(3)	root用户将用户tech1,tech2加入组sd
[root@localhost ~]# gpasswd -a tech1 sd
[root@localhost ~]# gpasswd -a tech2 sd

(4)	tech1用户尝试在/home/sd目录中创建1个文件techf1.txt,观察现象
不能

(5)	root用户对/home/sd目录设置冒险位,且目录所有者和组具rwx权限,其它用户无权限
[root@localhost ~]# chmod 2770 /home/sd/

(6)	tech1用户再次尝试在/home/sd中创建techf1.txt文件
[tech1@localhost ~]$ touch /home/sd/techf1.txt

(7)	tech2用户尝试向/home/sd/techf1.txt文件中添加hello world
[tech2@localhost ~]$ vim /home/sd/techf1.txt

(8)	database1用户是否可以使用vim修改文件/home/sd/techf1.txt,观察现象
不能

(9)	root用户将/home/sd的其它位权限设置为rwx,且设置黏贴位(黏贴位会影响第10题结果)
[root@localhost ~]# chmod 3777 /home/sd/

(10)	database1用户此时是否可以修改文件/home/sd/techf1.txt,观察现象

ACL概念


  • 除文件所有者和文件的组从属关系之外的用户和组被称为指定用户和指定组
  • ACL访问控制列表概念:为指定的用户和指定的组以不同的文件权限来访问文件
  • ACL权限解释如图
用户:显示用户acl设置,与标准的用户文件设置相同;rwx
组: 显示当前acl掩码设置,而不是组所有者设置;rw
其它:显示其它acl设置,与标准的其它文件设置相同;---
注意:chmod更改具有acl的文件的组权限时,更改的不是组所有者权限,实际更改的是acl掩码

文件ACL


①前三条注释:文件名;文件所有者;组所有者(operators)
② 用户条目:文件所有者权限,user的权限rwx;指定用户权限,consultant3用户没有任何权限;指定用户权限,UID=1005的权限rwx,掩码将有效权限限制为rw
③ 组条目:组所有者权限,operators权限rwx,掩码将有效权限限制为rw;指定组权限,consultant1权限r;指定组权限,GID=2210权限rwx,掩码将有效权限限制为rw
④ 掩码
⑤ 其它

目录ACL


① flag:如果存在任何其它特殊权限setuid,setgid,sticky,就会出现第四行注释显示所设置的标志,本例为setgid

ACL掩码


  • 1) 掩码定义可以授予指定用户,组所有者和指定组的最大权限
  • 2) 它不限制文件所有者和其它用户的权限
  • 3) 默认系统自动计算掩码
  • 4) 可以使用setfacl 设置掩码
  • 5) 默认添加,修改或删除任何受影响的ACL(指定用户或组所有者或指定组)时,会重新计算掩码

ACL权限优先级


  • 1) 如果以文件所有者身份运行进程,则应用文件的用户ACL权限
  • 2) 如果以指定用户ACL条目中列出的用户身份运行进程,则应用指定用户ACL权限(只要掩码允许)
  • 3) 如果以与文件的组所有者相匹配的组身份运行进程,或者以指定组ACL条目的组身份运行进程,则应用相匹配的ACL权限(只要掩码运行)

更改ACL文件权限练习


setfacl  -m  u:natasha:rw   file
setfacl  -m  u::rw  file
setfacl  -m  g:group1:rw   file
setfacl  -m  g::rw  file 
setfacl  -m  u::rwx,g:group1:rw,o::r  file
setfacl  -m  m::r    file
setfacl  -x    u:natasha  file   // 删除指定用户和指定组,任何其它现有ACL条目均保持活动
setfacl  -b    file              // 删除文件或目录的所有ACL条目
getfacl  file1  |  setfacl  --set-file=- file2        // file1的权限给文件file2  

课堂练习


1)	root用户在/tmp创建文件f1,f1内容是12345,查看文件f1权限
[root@localhost ~]#echo  12345 >>/tmp/f1
2)	root用户使用acl设置用户u1可以对文件f1进行读取和编辑(u1用户如果不存则创建),验证
[root@localhost ~]# setfacl -m u:u1:rw /tmp/f1
3)	root用户使用acl设置用户u2对文件f1没有任何权限(u2用户如果不存则创建),验证
[root@localhost ~]# setfacl -m u:u2:--- /tmp/f1
4)	root用户执行误操作:chmod g-r /tmp/f1,u1,u2是否可以读文件f1,u1是否可以编辑文件f1?
u1和u2不可以读取f1;u1可以修改f1
5)	root用户再次执行误操作:chmod g-w /tmp/f1,u1,u2是否可以读文件f1,u1是否可以修改文件f1?
u1和u2可以读取f1;u1不可以修改f1
6)	root用户执行操作:setfacl  -m  m::r  /tmp/f1,u1,u2是否可以读取文件f1?
u1可以读取f1,u2不可以读取f1

进程概述


  • 进程概念:进程是已启动的可执行程序,占用系统资源(如CPU,内存等);进程请求资源时进入睡眠状态,包括等待磁盘,网络,用户输入等;进程完成任务后正常情况下自动进行“自杀”,释放系统资源
  • 父进程概念:现有的进程(父)复制自己的地址空间(fork)创建1个新的子进程;每个新的进程分配有一个唯一进程ID(PID);任何进程都可以创建子进程;所有进程都是第一个系统进程的后代;RHEL8的第一个系统进程是systemd
  • 子进程概念:子进程执行自己的程序代码,父进程在子进程运行期间处于睡眠状态,设置一个在子进程完成时发出信号的请求;子进程退出时会向其父进程发出信号, 释放除PID之外的所有资源。父进程收到子进程的信号被唤醒,清理子进程的条目,释放进子进程的最后一个资源,然后父进程继续执行自己的程序代码
  • 僵尸进程:进程应该结束,但没有结束,依然占用系统资源

进程命令


1)	ps 命令:用于查看系统的进程
2)	pidof 命令:用于查询某个指定服务进程的PID值;举例:pidof  sshd

进程控制


1)	jobs:查看后台进程
2)	crtl+z:暂停前台正在运行的进程
3)	bg  %作业编号:将后台暂停的进程恢复在后台继续运行
4)	fg  %作业编号:将后台暂停的进程调回前台继续运行
5)	符号&:在命令行的结尾处附加符号&表示将放到后台运行
6)	bg和fg执行条件:进程已经在后台被挂起

课堂演示:打开两个终端


1)	左边窗口执行 (while true; do echo -n “ rhcsa ” >> ~/outfile;sleep 1; done) 
2)	右边窗口执行tail -f ~/outfile
3)	左边窗口执行crtl+z
4)	左边窗口先执行jobs,然后执行执行bg  %作业编号
5)	左边窗口使用第1题的方法添加“rhce”和“rhca”直接到后台运行 
     (while true; do echo -n “ rhce ” >> ~/outfile;sleep 1; done) &
     (while true; do echo -n “ rhca ” >> ~/outfile;sleep 1; done) &
6)	左边窗口将后台运行调到前台,然后终止(命令参考:fg  %作业编号;然后使用ctrl+c终止)

信号控制进程


  • kill  -l  查看信号
  • 信号编号视不同的Linxu硬件平台而不同,但信号名称和含义是标准化的,使用时建议使用信号名称
  • kill命令举例
1)	kill   -s  SIGKILL PID
2)	kill   -9  PID
3)	kill    信号   %序号
  • killall命令:用于终止某个指定名称的服务所对应的全部进程
  • pkill:向一个或多个符合选择条件的进程发送信号。选择条件可以是命令名称,特定用户拥有的进程,或者所有系统范围进程
1)	UID---由某一Linux用户账户拥有的进程
2)	GID---由某一Linux组账户拥有的进程
3)	终端---运行于特定控制终端的进程

课堂演示:打开两个终端


1)	左边窗口执行如下命令
      (while true; do echo -n “ rhcsa” >> ~/outfile;sleep 1; done) &
      (while true; do echo -n “ rhce” >> ~/outfile;sleep 1; done) &
      (while true; do echo -n “ rhca” >> ~/outfile;sleep 1; done) &
2)	右边窗口tail -f ~/outfile查看
3)	左边窗口使用kill命令暂停“rhcsa”输入;整洁终止“rhce”输入
命令参考:kill  -19  %作业编号
4)	左边窗口使用kill命令恢复“rhcsa”输入;终结“rhcsa”和“rhca”输入
命令参考:kill  -18  %作业编号
5)	左边窗口使用kill命令暴力终结“redhat”和“rhce”输入
命令参考:kill  -9   %作业编号
6)	左边窗口使用pkill命令结束tail显示
命令参考:pkill  tail 

监控进程活动


  • 负载平均值概念:Linux内核提供的一种度量方式;表示一段时间内感知的系统负载
  • 每5秒钟收集一次当前负载数,汇总这些数值,得到最近1分钟,5分钟,15分钟内的指数移动平均值
  • top监控

课堂演示:打开两个终端


1)	右边终端执行top实时监控系统进程
2)	左边窗口执行命令:dd if=/dev/zero of=/dev/null &
3)	右边窗口查看dd进程
4)	左边窗口再执行1次dd命令;右边窗口观察
5)	左边窗口再执行5次dd命令;右边窗口观察
6)	右边窗口top中杀掉1个dd进程,左边窗口使用pkill杀掉其余dd进程

进程优先级


  • nice级别取值范围介于-20~19,数值越小越抢占CPU资源,默认nice级别为0
  • root用户可以降低进程nice级别;普通用户只能提高自己的nice级别
  • NI显示进程的nice值;PR显示其调度的优先级
  • nice     -n  [-20…19]  command:启动进程时设置nice级别
  • renice  -n  [-20…19]  -p  PID:调整已经运行的应用程序或命令的nice级别

实验演示:两个终端窗口


1)	左边窗口执行2次命令:dd if=/dev/zero of=/dev/null & 
2)	右边窗口执行:top查看
3)	左边窗口执行命令: nice –n 10  dd if=/dev/zero of=/dev/null & 
4)	使用renice调整刚刚nice级别为10的进程,调整为-10
      renice  -n  -10  -p  PID(进程ID)