Linux系列教程——Linux基本权限、Linux特殊权限、LinuxACL控制、Linux输入输出

@

1 Linux基本权限

1.权限基本概述

1.什么是权限?

我们可以把它理解为操作系统对用户能够执行的功能所设立的限制,主要用于约束用户能对系统所做的操作,以及内容访问的范围,或者说,权限是指某个特定的用户具有特定的系统资源使用权力。

2.为什么要有权限?

因为系统中不可能只存在一个root用户,一定会存在多个用户,为了保护每个登陆用户的隐私和工作环境,所以就有了权限。(比如三个租客合租同一个房子,a租客要使用b租客的肥皂,那这个事情??)

3.权限与用户之间的关系?

在Linux系统中,针对文件定义了三种身份,分别是属主(owner)、属组(group)、其他人(others),每一种身份又对应三种权限,分别是可读(readable)、可写(writable)、可执行(excutable)。
img用户对文件资源,有三种角色ugo,当一个用户访问文件流程如下

  1. 判断用户是否为文件所有者,如果是则按所有者的权限进行访问2) 判断用户是否为文件所有组成员,如果是则按组的权限进行访问3) 如果不是所有者,也不是该文件所属组,则按匿名权限进行访问

4.权限中的rwx分别代表什么含义?

当我们使用ls -l查看一个文件的详细属性时,能看到每个文件都有一个9位基本权限位,比如: rwxr-xr-x其中每三位字符为一组,分别表示属主权限位,属组权限位,匿名权限位。linux中基本权限位则是使用这9位字符来表示,主要控制文件属主(User)、属组(Group)、其他用户(Other)

字母
含义
对应权限

r(read)
读取权限
4

w(write)
写入权限
2

x(execute)
执行权限
1

-(没有权限)
没有权限
0

PS: 如果权限位不可读、不可写、不可执行,则全部使用-作为占位符表示。

2.权限设置示例

文件示例: rwxrw-r– alice hr file1.txtQ1: alice对file1文件拥有什么权限?Q2: jack 对 file1.txt 文件有什么权限? 前提:jack 属于 hr 组Q3: tom 对 file1.txt 文件有什么权限?

1.为什么要设定权限,我们又如何修改一个文件的权限?

Q1: 为什么要设定权限,可以赋于某个用户或组 – 能够以何种方式 – 访问某个文件Q2: Linux下使用chmod命令来变更权限,root用户可以变更所有文件的权限,而普通用户仅能变更属于自己的文件。

2.使用chmod设定权限示例

方式一: user group other

[root@bgx ~]# touch file                    #创建文件
[root@bgx ~]# chmod a=rwx file              #给所有人添加读写执行权限
[root@bgx ~]# chmod a=-rwx file             #取消所有的权限
[root@bgx ~]# chmod u=rwx,g=rw,o=- file     #属主读写执行,属组读写,其他人无权限
[root@bgx ~]# chmod ug=rwx,o=r file         #属主属组读写执行,其他人读权限
[root@bgx ~]# ll file
-rwxrw-r-- 1 root root 0 Apr 13 03:29 file

方式二、number

#选项:  -R递归修改
[root@bgx ~]# touch file
[root@bgx ~]# chmod 644 file
[root@bgx ~]# chmod 600 file
[root@bgx ~]# ll file
-rw------- 1 root root 0 Apr 13 03:29 file

#针对目录设定权限
[root@bgx ~]# mkdir dir
[root@bgx ~]# chmod 777 dir/    #修改目录允许所有人访问
[root@bgx ~]# chmod -R 755 dir/ #修改目录及子目录权限
[root@bgx ~]# ll -d dir/
drwxr-xr-x 2 root root 6 Apr 13 03:34 dir/

3.权限设置案例

针对 hr 部门的访问目录/home/hr 设置权限,要求如下:1.root 用户和 hr 组的员工可以读、写、执行2.其他用户没有任何权限

[root@bgx ~]# groupadd hr
[root@bgx ~]# useradd hr01 -G hr
[root@bgx ~]# useradd hr02 -G hr
[root@bgx ~]# mkdir /home/hr
[root@bgx ~]# chgrp hr /home/hr
[root@bgx ~]# chmod 770 /home/hr
[root@bgx ~]# ll -d /home/hr
drwxrwx--- 2 root hr 6 Apr 13 03:26 /home/hr

3.权限设置案例

在Linux中权限对文件和对目录的影响是有不同区别的。

权限
对文件的影响
对目录的影响

读取权限(r)
具有读取阅读文件内容权限
具有浏览目录及子目录

写入权限(w)
具有新增、修改文件内容的权限
具有增加和删除目录内文件

执行权限(x)
具有执行文件的权限
具有访问目录的内容(取决于目录中文件权限)

文件权限实验案例:

#1.新建文件,并添加内容至文件中,默认文件匿名用户仅有读权限
[root@lqz ~]# echo "date" > filename
[root@lqz ~]# ll filename
-rw-r--r-- 1 root root 5 Jan 24 08:24 filename

#2.切换bgx普通用户
[root@lqz ~]# su - bgx

#3.对文件拥有读取的权限,但bgx用户对文件没有执行和删除的权限
[bgx@lqz ~]$ cat  /root/filename
date

#4.使用root增加x执行权限
[root@lqz ~]# chmod o+x /root/filename
[root@lqz ~]# ll /root/filename
-rw-r--r-x 1 root root 5 Jan 24 08:24 /root/filename

#5.测试x权限是否真的能执行该文件
[bgx@lqz ~]$ /root/filename
Wed Jan 24 08:28:34 EST 2018

#6.增加w执行权限
[root@lqz ~]# chmod o+w /root/filename
[root@lqz ~]# ll /root/filename
-rw-r--rwx 1 root root 5 Jan 24 08:24 /root/filename

#7.测试执行权限
[bgx@lqz ~]$ vim /root/filename

PS: 总结rwx对文件的影响读取权限(r)具有读取阅读文件内容权限1.只能使用查看类命令cat、head、tail、less、more
写入权限(w)具有新增、修改文件内容的权限1.使用vim编辑会提示权限拒绝, 但可强制保存,会覆盖文件的所有内容2.使用echo命令重定向的方式可以往文件内写入数据,>>可以进行追加3.不能删除文件,因为删除文件看的不是文件的属性,需要看上级目录是否有w的权限
执行权限(x)具有执行文件的权限1.执行权限什么用都没有2.如果普通用户需要执行文件,需要配合r权限
目录权限实验案例:

#示例1: 创建目录,并在该目录下创建文件,匿名用户对目录没有w权限,对文件有777权限 
[root@lqz ~]# mkdir /dirname
[root@lqz ~]# echo "test" >> /dirname/filename
[root@lqz ~]# chmod 777 /dirname/filename

#普通用户验证权限,能正常查看,但无法删除[奇怪]
[bgx@lqz ~]$ cat /dirname/filename
test
[bgx@lqz ~]$ rm -f /dirname/filename
rm: cannot remove ‘/dirname/filename’: Permission denied


#示例2: 设置目录777权限,相当于匿名用户对目录有w权限,对文件没有任何权限
[root@lqz ~]# chmod 777 /dirname/
[root@lqz ~]# chmod 000 /dirname/filename

#普通用户验证权限
[bgx@lqz ~]$ cat /dirname/filename
cat: /dirname/filename: Permission denied
[bgx@lqz ~]$ rm -f /dirname/filename
[bgx@lqz ~]$ touch /dirname/filename_2

PS: 总结rwx对目录的影响读取权限(r),如果目录只有r权限: 具有浏览目录及子目录权限1.可以使用ls命令浏览目录及子目录, 但同时也会提示权限拒绝2.使用ls -l命令浏览目录及子目录,文件属性会带问号,并且只能看到文件名总结: 目录只有r权限,仅仅只能浏览内的文件名,无其他操作权限
写入权限(w),如果目录只有w权限: 具有增加、删除或修改目录内文件名权限(需要x权限配合)PS: 如果目录有w权限, 可以在目录内创建文件, 删除文件(跟文件本身权限无关)不能进入目录、不能复制目录、不能删除目录、不能移动目录
执行权限(x),如果目录只有x权限1.只能进入目录2.不能浏览、复制、移动、删除
Linux权限总结与注意事项文件r权限, 只给用户查看,无其他操作文件rw权限, 可以查看和编辑文件内容文件rx权限, 允许查看和执行文件、但不能修改文件—–>PASS文件rwx权限, 能读,能写,能执行,但不能删除,因为删除需要看上级目录的权限有没有w—–>PASS目录rx权限, 允许浏览目录内文件以及子目录、并允许在目录内新建文件, 不允许创建、删除文件和目录目录wx权限, 能进入目录,能删除内容,能写入内容,但就是无法使用ls cat这样的命令—–>PASS目录rw权限, 能看,能写,但无法进入目录—–>PASSPS: 文件的 x权限小心给予,目录的 w权限小心给予。PS: 文件通常设定的权限是644,目录设定的权限是755PS: 控制目录权限755, 如果有普通用户需要操作目录里面的文件,在来看文件的权限

4.属主属组设置

变更文件属主和属组的意义?比如: 我现在手里有多套房,希望出售其中的A房进行变现,那么我会考虑将A房过户给金主,过户成功后A房就属于金主了,那么此时A房的拥有者就属于金主而不再属于我。img
在Linux中如何变更一个文件或者一个资源的属主和属组呢,可以使用chown、chgrp命令实现。chown能设置属主和属组,chgrp仅能设置属组。(所以用哪个你懂的)

#chown 更改属主以及属组 -R:递归修改

#准备环境,创建文件和目录
[root@bgx ~]# mkdir dir/test1 && touch dir/file

#示例1: 修改所属主为bin
[root@bgx ~]# chown bin dir/

#示例2: 修改所属组为adm
[root@bgx ~]# chown .adm dir/

#示例3: 递归修改目录及目录下的所有文件属主和属组
[root@bgx ~]# chown -R root.root dir/

2 Linux特殊权限

1.特殊权限概述

前面我们已经学习过 r(读)、w(写)、 x(执行)这三种普通权限,但是我们在査询系统文件权限时会发现出现了一些其他权限字母,比如:

[root@bgx ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd

在属主本来应该是 x(执行)权限的位置出现了一个小写s,这是什么权限?我们把这种权限称作 SetUID 权限,也叫作 SUID 的特殊权限。这种权限有什么作用呢?或者说能干啥?别急,先往下看…..

2.特殊权限SUID

1.问题抛出

在 Linux 系统中,每个普通用户都可以更改自己的密码,这是合理的设置。问题是,普通用户的信息保存在 /etc/passwd 文件中,用户的密码在 /etc/shadow 文件中,也就是说,普通用户在更改自己的密码时修改了 /etc/shadow 文件中的加密密码,但是文件权限显示,普通用户对这两个文件其实都是没有写权限的,那为什么普通用户可以修改自己的权限呢?……(难道学了个假的权限)

[root@bgx ~]# ll /etc/passwd
-rw-r--r-- 1 root root 6209 Apr 13 03:26 /etc/passwd
[root@bgx ~]# ll /etc/shadow
---------- 1 root root 11409 Apr 13 03:26 /etc/shadow

2.解决方案

其实,普通用户可以修改自己的密码在于 passwd 命令。该命令拥有特殊权限 SetUID,也就是在属主的权限位的执行权限上是 s。可以这样来理解它:当一个具有执行权限的文件设置 SetUID 权限后,用户在执行这个文件时将以文件所有者的身份来执行。
PS: 当普通用户使用 passwd 命令更改自己的密码时,实际上是在用 passwd 命令所有者 root 的身份在执行 passwd 命令,root 当然可以将密码写入 /etc/shadow 文件,所以普通用户也可以修改 /etc/shadow 文件,命令执行完成后,该身份也随之消失。

3.示例演示

举个例子,有一个用户 lamp,她可以修改自己的权限,因为 passwd 命令拥有 SetUID 权限;但是她不能査看 /etc/shadow 文件的内容,因为査看文件的命令(如 cat)没有 SetUID 权限。命令如下:

#自己可以修改自己的密码,从而改变/etc/shadow中的数据
[lamp@bgx ~]$ passwd

#但无法使用cat命令查看/etc/shadow
[lamp@bgx ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied

我们画一张示意图来理解上述过程img

4.例子解释

passwd 是系统命令,可以执行,所以可以赋予 SetUID 权限。lamp 用户对 passwd 命令拥有 x(执行)权限。lamp 用户在执行 passwd 命令的过程中,会暂时切换为 root 身份,所以可以修改 /etc/shadow 文件。命令结束,lamp 用户切换回自己的身份。PS: cat命令没有 SetUID权限,所以使用 lamp 用户身份去访问 /etc/shadow 文件,当然没有相应权限了。F: 但如果将passwd命令的suid去掉会发生什么???
2.suid授权方法4000 权限字符s(S),用户位置上的x位上设置

# chmod 4755 passwd
# chmod  u+s  passwd

3.suid的作用1.让普通用户对可执行的二进制文件,临时拥有二进制文件的所属主权限。2.如果设置的二进制文件没有执行权限,那么suid的权限显示就是大S。3.特殊权限suid仅对二进制可执行程序有效,其他文件或目录则无效。注意: suid极度危险,不信可以尝试对vim或rm进行设定SetUID。

3.特殊权限SGID

将目录设置为sgid后,如果在该目录下创建文件,都将与该目录的所属组保持一致,演示如下

#1.建立测试目录
[root@bgx ~]# cd /tmp/ && mkdir dtest

#2.给测试目录赋予SetGID权限,检查SetGID是否生效
[root@bgx tmp]# chmod g+s dtest/ && ll -d dtest/
drwxr-sr-x 2 root root 6 Apr 13 05:21 dtest/

#3.给测试目录赋予777权限,让普通用户可以写
[root@bgx tmp]# chmod 777 dtest/

#4.切换成普通用户lamp,并进入该目录
[root@bgx tmp]# su - lamp
[lamp@bgx ~]$ cd /tmp/dtest/

#5.普通用户创建测试文件,检查文件的信息
[lamp@bgx dtest]$ touch lamp_test
[lamp@bgx dtest]$ ll
-rw-rw-r-- 1 lamp root 0 Apr 13 05:21 lamp_test

2.sgid授权方法: 2000权限字符s(S),取决于属组位置上的x

# chmod 2755  directory 
# chmod  g+s  directory

3.sgid作用

1.针对用户组权限位修改,用户创建的目录或文件所属组和该目录的所属组一致。2.当某个目录设置了sgid后,在该目录中新建的文件不在是创建该文件的默认所属组3.使用sgid可以使得多个用户之间共享一个目录的所有文件变得简单。

4.特殊权限SBIT

Sticky(SI TI KI)粘滞位目前只对目录有效,作用如下:普通用户对该目录拥有 w 和 x 权限,即普通用户可以在此目录中拥有写入权限。如果没有粘滞位,那么普通用户拥有 w 权限,就可以删除此目录下的所有文件,包括其他用户建立的文件。但是一旦被赋予了粘滞位,除了 root 可以删除所有文件,普通用户就算拥有 w 权限,也只能删除自己建立的文件,而不能删除其他用户建立的文件。

[root@bgx tmp]# ll -d /tmp/
drwxrwxrwt. 12 root root 4096 Apr 13 05:32 /tmp/

2.sticky授权方法,1000 权限字符t(T),其他用户位的x位上设置。

# chmod 1755  /tmp
# chmod o+t /tmp

3.sticky作用

1.让多个用户都具有写权限的目录,并让每个用户只能删自己的文件。2.特殊sticky目录表现在others的x位,用小t表示,如果没有执行权限是T3.一个目录即使它的权限为”777”如果是设置了粘滞位,除了目录的属主和”root”用户有权限删除,除此之外其他用户都不允许删除该目录。

5.权限属性chattr

chatrr 只有 root 用户可以使用,用来修改文件系统的权限属性,建立凌驾于 rwx 基础权限之上的授权。chatrr 命令格式:[root@bgx ~]# chattr [+-=] [选项] 文件或目录名

#选项: + 增加权限 -减少权限 =等于某个权限
# a:让文件或目录仅可追加内容
# i:不得任意更动文件或目录

#1.创建文件并设置属性
[root@lqz ~]# touch file_a file_i
[root@lqz ~]# lsattr file_a file_i
---------------- file_a
---------------- file_i

#2.使用chattr设置属性,lsattr查看权限限制
[root@lqz ~]# chattr +a file_a
[root@lqz ~]# chattr +i file_i
[root@lqz ~]# lsattr file_a file_i
-----a---------- file_a
----i----------- file_i

#3.a权限,无法写入和删除文件,但可以追加数据,适合/etc/passwd这样的文件
[root@lqz ~]# echo "aa" > file_a
bash: file_a: Operation not permitted
[root@lqz ~]# rm -f file_a
rm: cannot remove ‘file_a’: Operation not permitted
[root@lqz ~]# echo "aa" >> file_a

#5.i权限, 无法写入,无法删除,适合不需要更改的重要文件加锁
[root@lqz ~]# echo "i" > file_i
bash: file_i: Permission denied
[root@lqz ~]# echo "i" >> file_i
bash: file_i: Permission denied
[root@lqz ~]# rm -f  file_i
rm: cannot remove ‘file_i’: Operation not permitted

#6.解除限制
[root@tianyun ~]# chattr -a file100 
[root@tianyun ~]# chattr -i file200

6.进程掩码umask

1.umask是什么?

当我们登录系统之后创建一个文件总是有一个默认权限的,比如: 目录755、文件644、那么这个权限是怎么来的呢?这就是umask干的事情。umask设置了用户创建文件的默认权限。

2.umask是如何改变创建新文件的权限

系统默认umask为022,那么当我们创建一个目录时,正常情况下目录的权限应该是777,但umask表示要减去的值,所以新目录文件的权限应该是777 - 022 =755。至于文件的权限也依次类推666 - 022 =644。

3.umask涉及哪些配置文件

umask涉及到的相关文件/etc/bashrc /etc/profile ~/.bashrc ~/.bash_profileshell (vim,touch) –umask–> 会影响创建的新文件或目录权限vsftpd服务如果修改–umask–> 会影响ftp服务中新创建文件或创建目录权限useradd如果修改umask–> 会影响用户HOME家目录权限

4.umask演示示例

#1.假设umask值为:022(所有位为偶数)
#文件的起始权限值
6 6 6  -  0 2 2  = 6 4 4 

#2.假设umask值为:045(其他用户组位为奇数)
#计算出来的权限。由于umask的最后一位数字是5,所以,在其他用户组位再加1。
6 6 6  -   0 4 5 = 6 2 1

#3.默认目录权限计算方法
7 7 7  -  0 2 2 = 7 5 5
 
#umask所有位全为偶数时
# umask 044
# mkdir d044   目录权限为733
# touch f044   文件权限为622

#umask部分位为奇数时
# umask 023
# mkdir d023   目录权限为754
# touch f023   文件权限为644

#umask值的所有位为奇数时
# umask 035
# mkdir d035   目录权限为742
# touch f035   文件权限为642

示例1: 在 shell 进程中创建文件

#查看当前用户的umask权限
[root@lqz ~]# umask
0022
[root@lqz ~]# touch file0022
[root@lqz ~]# mkdir dir0022
[root@lqz ~]# ll -d file0022  dir0022/
drwxr-xr-x 2 root root 6 Jan 24 09:02 dir0022/
-rw-r--r-- 1 root root 0 Jan 24 09:02 file0022

示例2: 修改 shell umask 值(临时生效)

[root@lqz ~]# umask 000
[root@lqz ~]# mkdir dir000
[root@lqz ~]# touch file000
[root@lqz ~]# ll -d dir000 file000
drwxrwxrwx 2 root root 6 Jan 24 09:04 dir000
-rw-rw-rw- 1 root root 0 Jan 24 09:04 file000

示例3: 通过 umask 决定新建用户 HOME 目录的权限

[root@lqz ~]# vim /etc/login.defs
UMASK 077
[root@lqz ~]# useradd dba
[root@lqz ~]# ll -d /home/dba/
drwx------. 4 dba dba 4096 3 月 11 19:50 /home/dba/

[root@tianyun ~]# vim /etc/login.defs
UMASK 000
[root@lqz ~]# useradd sa
[root@lqz ~]# ll -d /home/sa/
drwxrwxrwx. 4 sa sa 4096 3 月 11 19:53 /home/sa/

3 LinuxACL控制

1.ACL访问控制概述

上一章节我们学习了基础权限UGO、特殊权限,但所有的权限是针对某一类用户设置的, 如果希望对文件进行自定义权限控制,就需要用到文件的访问控制列表ACL

UGO设置基本权限: 只能一个用户,一个组和其他人 ACL设置基本权限: r、w、x 设定acl只能是root管理员用户. 相关命令: getfacl , setfacl

acl基本使用方式

//环境准备
[root@lqz ~]# cp /etc/passwd /root/passwd
//文件在没有设定acl, 看到的和传统权限是一样
[root@lqz ~]# ll passwd
-rw-r--r-- 1 root root 0 10-26 13:59 /home/test.txt

//使用getacl查看权限
[root@lqz ~]# getfacl passwd 
# file: passwd
# owner: root
# group: root
user::rw-   //文件owner权限
group::r--  //文件拥有组权限
other::r--  //其他人权限

1.设定acl权限案例如下

-rw-r--r-- 1 root root 1380 Feb 27 11:25 passwd

alice 拥有读写权限    rw
bgx  没有任何权限     -
jack 组拥有读权限     r
匿名用户拥有读写权限  rw


//建立相关用户
[root@lqz ~]# useradd alice
[root@lqz ~]# useradd bgx
[root@lqz ~]# useradd jack

//增加用户 alice 权限
[root@lqz ~]# setfacl -m u:alice:rw passwd

//增加用户 bgx 权限
[root@lqz ~]# setfacl -m u:bgx:- passwd

//增加匿名用户权限
[root@lqz ~]# setfacl -m o::rw passwd

//增加组权限
[root@lqz ~]# setfacl -m g:jack:r passwd


注意: 如果用户同时属于不同的两个组,并且两个组设定了acl访问控制
    1.根据acl访问控制优先级进行匹配规则
    2.如有用户拥有多个组的权限不同的权限,优先使用最高权限(模糊匹配)

2.查看acl权限

[root@lqz ~]# ll passwd
-rw-rw-rw-+ 1 root root 1531 Jan 26 07:52 passwd

[root@lqz ~]# getfacl passwd
# file: passwd
# owner: root
# group: root
user::rw-
user:bgx:---
user:alice:rw-
group::r--
group:jack:r--
mask::rw-
other::rw-

3.移除acl权限

//移除jack组的acl权限
[root@lqz ~]# setfacl -x g:jack passwd

//移除bgx用户的acl权限
[root@lqz ~]# setfacl -x u:bgx passwd

//移除文件和目录所有acl权限
[root@lqz ~]# setfacl -b passwd

//移除默认的acl
[root@lqz ~]# setfacl -k dir

4.查看acl帮助

//EXAMPLES 示例文档
[root@lqz ~]# man setfacl

//复制 file1 的 ACL 权限给 file2
[root@lqz ~]# setfacl -m u:alice:rw,u:bgx:r,g:jack:rw file1
[root@lqz ~]# getfacl file1 |setfacl --set-file=- file2

2.ACL高级特性MASK

mask用于临时降低用户或组的权限,但不包括文件的所有者和其他人。mask最主要的作用是用来决定用户的最高权限。

mask默认不会对匿名用户降低权限,所以为了便于管理文件的访问控制,建议匿名用户的权限置为空

//临时降低用户或组权限
[root@lqz ~]# setfacl -m mask::rw filename

小结 1.mask会影响哪些用户,除了所有者和其他人。 2.mask权限决定了用户访问文件时的最高权限。(如何影响) 3.mask用于临时降低用户访问文件的权限。(mask做什么) 4.任何重新设置acl访问控制会清理mask所设定的权限。

3.ACL高级特性Default

default: 继承(默认)
alice能够对/opt目录以及以后在/opt目录下新建的文件有读、写、执行权限

//赋予 alice 对/home 读写执行权限 
[root@lqz ~]## setfacl -R -m u:alice:rwX /opt
//赋予 alice 对以后在/home 下新建的文件有读写执行权限(使 alice 的权限继承) 
[root@lqz ~]## setfacl -m d:u:alice:rwX /opt

//检查对应的权限
[root@linux-node1 ~]# getfacl /opt/
getfacl: Removing leading '/' from absolute path names
# file: opt/
# owner: root
# group: bgx
user::rwx
user:alice:rwx
group::rwx
mask::rwx
other::rwx
default:user::rwx
default:user:alice:rwx
default:group::rwx
default:mask::rwx
default:other::rwx

4.ACL访问控制实践案例

案例1: 将新建文件的属性修改tom:admin, 权限默认为644要求: tom对该文件有所有的权限, mary可以读写该文件, admin组可以读写执行该文件, jack只读该文件, 其他人一律不能访问该文件

//实验前, 建立几个普通用户
[root@lqz ~]# useradd tom
[root@lqz ~]# useradd bean
[root@lqz ~]# useradd mary
[root@lqz ~]# useradd jack
[root@lqz ~]# useradd sutdent
[root@lqz ~]# groupadd admin
[root@lqz ~]# gpasswd -a mary admin
[root@lqz ~]# gpasswd -a bean admin

//检查用户属性
[root@linux-node1 ~]# id tom
uid=1004(tom) gid=1004(tom) groups=1004(tom)
[root@linux-node1 ~]# id mary
uid=1006(mary) gid=1006(mary) groups=1006(mary),1007(admin)
[root@linux-node1 ~]# id bean
uid=1005(bean) gid=1005(bean) groups=1005(bean),1007(admin)
[root@linux-node1 ~]# id jack
uid=1002(jack) gid=1002(jack) groups=1002(jack)
[root@linux-node1 ~]# id sutdent
uid=1007(sutdent) gid=1008(sutdent) groups=1008(sutdent)

//准备相关文件
[root@linux-node1 ~]# cp /etc/passwd /root/
[root@linux-node1 ~]# chown tom:admin passwd
[root@linux-node1 ~]# chmod 644 passwd

//检查设定前的acl列表
[root@linux-node1 ~]# getfacl passwd
# file: passwd
# owner: tom
# group: admin
user::rw-
group::r--
other::r--

//设定acl权限
[root@linux-node1 ~]# setfacl -m u::rwx,u:mary:rw,u:jack:r,g:admin:rwx,o::- passwd

//检查acl权限
[root@linux-node1 ~]# getfacl passwd
# file: passwd
# owner: tom
# group: admin
user::rwx
user:jack:r--
user:mary:rw-
group::r--
group:admin:rwx
mask::rwx
other::---

acl的控制规则是从上往下匹配 1.tom由于是文件的拥有者,所以直接按照user::rwx指定的权限去操作 2.mary用户从上往下寻找匹配规则,发现user:mary:rw-能够精确匹配mary用户,尽管mary属于admin组,同时admin组有rwx的权限,但是由于mary用户的规则在前面,所有优先生效。 3.bean由于找不到精确匹配的规则,而bean是属于admin组,根据文件的定义,该文件是属于admin组,所以bean的权限是按照group:admin:rwx的权限去操作。 4.jack用户从上往下寻找匹配规则,发现user:jack:r--能够精确匹配jack用户。 5.student用户找不到精确匹配的user定义规则, 也找不到相关组的定义规则,最后属于other

案例2: lab acl setup

controller组成员有:student
sodor组成员有:thomas,james

目录: /shares/steamies
文件: /shares/steamies/file
脚本: /shares/steamies/test.sh

controller属于该目录的所属组, 新建文件必须属于controller组
sodor组的成员对该目录拥有rwx权限
sodor组成员james对该目录及子目录(包括以后新建立的文件)没有任何权限

实际操作

//准备用户
[root@linux-node1 ~]# groupadd controller
[root@linux-node1 ~]# groupadd sodor
[root@linux-node1 ~]# useradd student -G controller
[root@linux-node1 ~]# useradd thomas -G sodor
[root@linux-node1 ~]# useradd james -G sodor

//准备目录
[root@linux-node1 ~]# mkdir /shares/steamies -p
[root@linux-node1 ~]# echo "file" >> /shares/steamies/file
[root@linux-node1 ~]# echo "echo 123" >> /shares/steamies/test.sh
[root@linux-node1 ~]# chmod 755 /shares/steamies/test.sh
[root@linux-node1 ~]# chown -R  :controller /shares/steamies/
[root@linux-node1 ~]# chmod g+s /shares/steamies/


//设定权限(X表示,如果原本有执行权限就保留,如果没有则不添加)
[root@linux-node1 ~]# setfacl -R -m g:sodor:rwX,u:james:- /shares/steamies/

//设定继承规则
[root@linux-node1 ~]# setfacl -R -m d:g:sodor:rwX,d:u:james:- /shares/steamies/


[root@linux-node1 steamies]# getfacl /shares/steamies/
getfacl: Removing leading '/' from absolute path names
# file: shares/steamies/
# owner: root
# group: controller
# flags: -s-
user::rwx
user:james:---
group::r-x
group:sodor:rwx
mask::rwx
other::r-x
default:user::rwx
default:group::r-x
default:group:sodor:rwx
default:mask::rwx
default:other::r-x

4 Linux输入输出

1.重定向概述

1.什么是重定向

将原本要输出到屏幕的数据信息,重新定向到某个指定的文件中。比如:每天凌晨定时备份数据,希望将备份数据的结果保存到某个文件中。这样第二天通过查看文件的内容就知道昨天备份的数据是成功还是失败。

2.为何要使用重定向

1.当屏幕输出的信息很重要,而且希望保存重要的信息时;2.后台执行中的程序,不希望他干扰屏幕正常的输出结果时;3.系统的例行命令, 例如定时任务的执行结果,希望可以存下来时;4.一些执行命令,我们已经知道他可能出现错误信息, 想将他直接丢弃时;5.错误日志与正确日志需要分别输出至不同的文件保存时;

3.学习重定向的预备知识,标准输入与输出

当运行一个程序时通常会自动打开三个标准文件,分别是标准输入、标准输出、错误输出

名称 文件描述符 作用
标准输入(STDIN) 0 默认是键盘,也可以是文件或其他命令的输出。
标准输出(STDOUT) 1 默认输出到屏幕。
错误输出(STDERR) 2 默认输出到屏幕。

文件名称(filename)
3+

进程将从标准输入中得到数据,将正常输出打印至屏幕终端,将错误的输出信息也打印至屏幕终端。PS: 进程是使用文件描述符(file descriptors)来管理打开的文件
img
以 cat 命令为例, cat 命令的功能是从命令行给出的文件中读取数据,并将这些数据直接送到标准输出。若使用如下命令:

#会把文件/etc/passwd的内容输出显示到屏幕上
[root@lqz ~]# cat /etc/passwd

但如果 使用 cat 命令没有跟上输入的文件名,那么cat命令则会通过命令行标准输入中读取数据, 并将其送到标准输出。

[root@lqz ~]# cat
hello   #标准输入
hello   #标准输出
^C
#用户输入的每一行都立刻被cat命令输出到屏幕上。

下面了解一下标准输入输出过程

#持续追踪查看文件内容
[root@lqz ~]# tail -f /etc/passwd
ctrl+z 将进程转到后台

#查看运行的进程
[root@lqz ~]# ps
PID TTY          TIME CMD
5848 pts/1    00:00:00 bash
6885 pts/1    00:00:00 tail
6888 pts/1    00:00:00 ps

#查看tail命令的pid,6885进程下的文件描述符
[root@lqz ~]# ls -l /proc/6885/fd
total 0
lrwx------ 1 root root 64 Dec  3 06:57 0 -> /dev/pts/1
lrwx------ 1 root root 64 Dec  3 06:57 1 -> /dev/pts/1
lrwx------ 1 root root 64 Dec  3 06:56 2 -> /dev/pts/1
lr-x------ 1 root root 64 Dec  3 06:57 3 -> /etc/passwd
lr-x------ 1 root root 64 Dec  3 06:57 4 -> inotify

#Linux查看标准输入输出设备
[root@lqz ~]# ls -l /dev/std
lrwxrwxrwx 1 root root 15 Dec  2 22:30 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Dec  2 22:30 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Dec  2 22:30 /dev/stdout -> /proc/self/fd/1

2.输出重定向

输出重定向,改变输出内容的位置。输出重定向有如下几种方式,如表格所示

类型 操作符 用途
标准覆盖输出重定向 > 将程序输出的正确结果输出到指定的文件中,会覆盖文件原有的内容
标准追加输出重定向 >> 将程序输出的正确结果以追加的方式输出到指定文件,不会覆盖原有文件
错误覆盖输出重定向 2> 将程序的错误结果输出到执行的文件中,会覆盖文件原有的内容
错误追加输出重定向 2>> 将程序输出的错误结果以追加的方式输出到指定文件,不会覆盖原有文件
标准输入重定向 << 将命令中接收输入的途径由默认的键盘更改为指定的文件或命令

案例1: 标准输出重定向(每次都会覆盖文件)
img

#标准输出重定向, 先清空,后写入, 如果文件不存在则创建
[root@lqz ~]# ifconfig eth0 > abc

案例2: 标准输出重定向(会往文件的尾部在添加内容)
img

#标准追加输出重定向, 向配置文件末尾追加内容
[lqz@lqz ~]$ echo "This is network conf" >> if

案例3: 错误输出重定向
img

#正确输出以及错误输出重定向至一个文件
[root@lqz ~]# useradd lqz
[root@lqz ~]# su - lqz

#将标准输出和标准错误输出重定向到不同文件
[lqz@lqz ~]$ find /etc -name ".conf" 1>a 2>b

案例4: 正确和错误都输入到相同位置img

#将标准输出和标准错误输出重定向到同一个文件, 混合输出
[lqz@lqz ~]$ find /etc -name ".conf" &>ab

#合并两个文件内容至一个文件
[lqz@lqz ~]$ cat a b > c

案例5: 正确和错误都输入到相同位置img

#重定向到相同的位置
[root@lqz ~]# ls /root /error >ab  2>&1

案例6: 重定向到空设备/dev/null
img

#将产生的任何数据放入黑洞设备,则视为丢弃。
[root@lqz ~]# ls /root /error >ab 2>/dev/null
[root@lqz ~]# ls /root /error >ab &>/dev/null

案例7: 脚本中使用重定向 (了解即可)

[root@lqz ~]# vim ping.sh 
ping -c1 10.0.0.1
if [ $? -eq 0 ];then
    echo "10.0.0.1 is up." 
else
    echo "10.0.0.1 is down." 
fi
[root@lqz ~]# chmod +x ping.sh 
[root@lqz ~]# ./ping.sh

#改进后版
[root@lqz ~]# vim ping.sh
ping -c1 10.0.0.1 &>/dev/null
if [ $? -eq 0 ];then
    echo "10.0.0.1 is up." 
else
    echo "10.0.0.1 is down." 
fi

案例8: 脚本中使用重定向 (了解即可)

[root@lqz ~]# vim ping2.sh 
ping -c1 10.0.0.1 &>/dev/null 
if [ $? -eq 0 ];then
    echo "10.0.0.1 is up." >>up.txt 
else
    echo "10.0.0.1 is down." >>down.txt 
fi
[root@lqz ~]# chmod +x ping2.sh 
[root@lqz ~]# ./ping2.sh

3.输入重定向

输入重定向,即原本从键盘等上获得的输入信息,重定向由命令的输出作为输入。< 等价 0<
案例1: 从文件中读入输入的操作

#没有改变输入的方向,默认键盘
[root@lqz ~]# mail alice 
Subject: hello
1111 
2222
3333
.   #结束
EOT

#检查是否收到邮件
[root@lqz ~]# su - alice
[root@lqz ~]# mail

#输入重定向,来自于文件
[root@lqz ~]# mail -s "test01" alice < /etc/hosts

案例2: 无法形容案例,请看实际操作

#没有改变输入的方向,默认键盘,此时等待输入
[root@lqz ~]# grep 'root' 
xxx
xxx

[root@lqz ~]# grep 'root' < /etc/passwd
root:x:0:0:root:/root:/bin/bash

案例3: 无法形容案例,请看实际操作

[root@lqz ~]# dd if=/dev/zero of=/file1.txt bs=1M count=20
[root@lqz ~]# dd </dev/zero >/file2.txt bs=1M count=20

案例4: mysql如何恢复备份,了解即可,不用关注。

[root@lqz ~]# mysql -uroot -p123 < bbs.sql

案例5: 利用重定向建立多行数据的文件

#手动执行 shell 命令
[root@lqz ~]# echo "111" > file1.txt 
[root@lqz ~]# cat file1.txt
111
[root@lqz ~]# cat >file2.txt
111
222
333
^D

[root@lqz ~]# cat >>file3.txt
aaa
bbb
ccc
^D

案例6: 脚本中打印菜单的一种使用方法。

[root@lqz ~]# vim vm.sh
cat <<-EOF
+------------------- --- ---- --- ---- --- --- ---- --- --+ ||
| ====================== | 
| 虚拟机基本管理 v5.0 |
| by lqz |
| ====================== | 
| 1. 安装 KVM |
| 2. 安装或重置 CentOS-6.9 | 
| 3. 安装或重置 CentOS-7.4 | 
| 5. 安装或重置 Windows-7  | 
| 6. 删除所有虚拟机 |
| q. 退出管理程序 |
+------------------- --- ---- --- ---- --- --- ---- --- --+ 
EOF

案例7: 两条命令同时重定向

[root@lqz ~]# ls; date &>/dev/null
[root@lqz ~]# ls &>/dev/null; date &>/dev/null
[root@lqz ~]# (ls; date) &>/dev/null

#后台执行
[root@lqz ~]# (while :; do date; sleep 2; done) &
[1] 6378
[root@lqz ~]# (while :; do date; sleep 2; done) &>date.txt &
[root@lqz ~]# jobs
[1]+ 运行中 ( while :; do date; sleep 2;
done ) &>/date.txt &

扩展点: subshell 了解即可

[root@lqz ~]# cd /boot; ls

//subshell 中执行
[root@lqz ~]# (cd /boot; ls)

#如果不希望某些命令的执行对当前 shell 环境产生影响,请在subshell中执行

4.进程管道技术

1.什么是管道

管道操作符号 “|” ,主要用来连接左右两个命令, 将左侧的命令的标准输出, 交给右侧命令的标准输入PS: 无法传递标准错误输出至后者命令

2.管道流程示意图

img格式: cmd1 | cmd2 [...|cmdn]

3.管道使用案例

案例1: 将/etc/passwd 中的用户按 UID 大小排序

[root@lqz ~]# sort -t":" -k3 -n /etc/passwd
[root@lqz ~]# sort -t":" -k3 -n /etc/passwd -r
[root@lqz ~]# sort -t":" -k3 -n /etc/passwd |head

案例2: 统计当前/etc/passwd 中用户使用的 shell 类型

#思路:取出第七列(shell) | 排序(把相同归类)| 去重
[root@lqz ~]# awk -F: '{print $7}' /etc/passwd
[root@lqz ~]# awk -F: '{print $7}' /etc/passwd |sort
[root@lqz ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq
[root@lqz ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq -c

案例4: 统计网站的访问情况 top 20

#思路: 打印所有访问的连接 | 过滤访问网站的连接 | 打印用户的 IP | 排序 | 去重

[root@lqz ~]# yum -y install httpd
[root@lqz ~]# systemctl start httpd
[root@lqz ~]# systemctl stop firewalld

[root@lqz ~]# ss -an |grep :80 |awk -F":" '{print $8}' |sort |uniq -c
[root@lqz ~]# ss -an |grep :80 |awk -F":" '{print $8}' |sort |uniq -c |sort -k1 -rn |head -n 20

案例5: 打印当前所有 IP

[root@lqz ~]# ip addr |grep 'inet ' |awk '{print $2}' |awk -F"/" '{print $1}'
127.0.0.1
192.168.69.112

案例6: 打印根分区已用空间的百分比(仅打印数字)

[root@lqz ~]# df |grep '/$' |awk '{print $5}' |awk -F"%" '{print $1}'

PS: 管道命令符能让大家能进一步掌握命令之间的搭配使用方法,进一步提高命令输出值的处理效率。

4.管道中的tee技术

img

#选项: -a追加
[root@lqz ~]# ip addr |grep 'inet ' |tee ip.txt |awk -F"/" '{print $1}' |awk '{print $2}'
127.0.0.1
10.0.0.100

[root@lqz ~]# cat ip.txt
inet 127.0.0.1/8 scope host lo
inet 10.0.0.100/24 brd 192.168.69.255 scope global ens32

重定向与 tee 有他们在使用过程中有什么区别

[root@lqz ~]# date > date.txt    #直接将内容写入date.txt文件中
[root@lqz ~]# date |tee date.txt #命令执行会输出至屏幕,但会同时保存一份至date.txt文件中

5.xargs参数传递,主要让一些不支持管道的命令可以使用管道技术

# which cat|xargs ls- l
# ls |xargs rm -fv
# ls |xargs cp -rvt /tmp/ -或-> ls | xargs -I {} cp -rv {} /tmp/
# ls |xargs mv -t /tmp/   -或-> ls | xargs -I {}  mv {} /tmp
posted @ 2024-04-22 20:09  码诅  阅读(34)  评论(0编辑  收藏  举报  来源