19 Star 187 Fork 91

baoke / Linux学完就忘系列

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
15.文件查找find和特殊权限及facl.md 13.13 KB
一键复制 编辑 原始数据 按行查看 历史

文件查找

在文件系统上查找符合条件的文件;
实现工具:locate,find

locate

依赖于事先构建好的索引库;
系统自动实现(周期性任务计划):一般每天晚上空闲时间自动更新数据库;
手动更新数据库(updatedb);

工作特性:
查找速度快;
模糊查找;
非实时查找;

locate [OPTION]... PATTERN...
-b:只匹配路径中的基名;
-c:统计出共有多少个符合条件的文件件;
-r:基于基本正则表达式来编写模式;

注意:索引构建过程需要遍历整个根文件系统,极消耗资源;

#只匹配路径中的基名,依然会模糊查找  
locale -b passwd
#只有基名中包含passwd的文件有多少个
locate -b -c  passwd

find

实时查找工具,通过遍历指定起始路径下文件系统层级结构完成文件查找;

工作特性:
查找速度略慢;
精确查找;
实时查找;

用法:
find [OPTIONS] [查找起始路径] [查找条件] [处理动作]
查找起始路径:指定具体搜索目标起始路径;默认为当前目录;
查找条件:指定的查找标准,可以根据文件名、大小、类型、从属关系、权限等等标准进行;默认为找出指定路径下的所有文件;
处理动作:对符合查找条件的文件做出操作,例如删除等操作;默认为输出至标准输出;

查找条件:
表达式:选项和测试

测试:结果通常为布尔型("true","false")

根据文件名查找:
-name "glob"
-iname "glob"
支持glob通配符:*、?、[]、[^]

-regex pattern:基于正则表达式模式查找文件,撇配是整个路径,而非其名;

#精确查找passwd文件名的文件
find /etc -name "passwd"
#在当前路径下查找所有文件,find和find./是一样的,默认查找当前目录所有文件;  
find
find ./

#文件名不区分大小写查找和使用glob通配符
mkdir /etc/test
touch /etc/test/Passwd
touch /etc/test/MPASSWD.txt
find /etc -iname "passwd"
find /etc -iname "*passwd*"

根据文件从属关系查找:
-user USERNAME:查找属主指定用户的所有文件;
-group GRPNAME:查找属组指定组的所有文件;
-uid:查找属主指定UID的所有文件;
-gid:查找属组指定的GID的所有文件;
-nouser:查找没有属主的文件;
-nogroup:查找没有属组的文件;

#根据属主查找
find /tmp -user "archlinux"
#根据属组查找
find /tmp -group "mygrp"
根据属主,属组查找
find /tmp -user "archlinux" -group "mygrp"
#根据用户id查找
id archlinux
find /tmp -uid 4003

根据文件类型查找:
-type TYPE:
f:普通文件
d:目录文件
l:符号链接文件
b:块设备文件
c:字符设备文件
p:管道文件
s:套接字文件

#查找/dev,块设备文件,-ls代表的是处理动作,如果不加默认是-print
find /dev -type b -ls
#查找/etc,符号链接文件
find /etc -type l -ls

组合测试:
与: -a,默认组合逻辑;
或: -o;
非: -not,!;

注意:组合测试加在两个测试之间;

#默认是与,所以不加-a和加-a结果是一样的
find /tmp -user jesse -type f -ls
find /tmp -user jesser -a -type f -ls
,
#查找属组为jesse或者为archlinux的文件,两边都要加-ls,只加一边的-ls,只显示那一边的列表;感觉-a并不存在此问题
find /tmp -user jesse -ls  -o -user archlinux -ls
#或者可以这么写
find /tmp \( -user jesse -o -user archlinux \)  -ls



#不是普通文件的列表
find /tmp -not -type f -ls

练习:
1、找出/tmp目录下属主为非root的所有文件;

find /tmp ! -user root -ls

2、找出/tmp目录下文件名不包含fstab字符串的文件;

find /tmp ! -iname "*fstab*" -ls

3、找出/tmp目录下属主为非root,而且文件名不包含fstab字符串的文件;
!A -a !B =!(A -o B)
!A -o !B =!(A -a B)

find /tmp ! -iname "*fstab*" -a ! -user root -ls
#或者可以这么写
find /tmp ! \( -iname "*fstab*" -o -user root \)  -ls

根据文件的大小查找:
-size [+|-] #UNIT
常用单位:k,M,G

ls -lh /tmp
#查找大小为35k的文件
find /tmp -size 35k
#查找小于35k的文件,-35K的范围是0k-34k之间,34.1k也不在此范围内
find /tmp -size -35k 
#查找大于35k的文件,不包含35k
find /tmp -size +35k

根据时间戳查找:
atime:访问时间、mtime:修改时间、ctime:改变时间
以"天"为单位:
-atime
-mtime
-ctime

以"分钟"为单位:
-amin
-mmin
-cmin

#7天之前未访问过的文件,可以使用stat path/filename查看文件时间戳信息
find /tmp -atime +7 -ls
#1天之内曾今修改过的文件
find /tmp -mtime -1 -ls

根据权限查找
-perm [/|-] mode
mode:精确权限匹配;
/mode:任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足;9位权限之间存在"或"关系;
-mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足;9位权限之间存在"与"关系;

#精确权限匹配,查找当前目录下权限为644的文件
find ./ -perm 644 -ls
#任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足
find ./ -perm /666 -ls
#至少有一类用户有写权限的文件
find ./ -perm /222 -ls
#至少有一类用户有执行权限的文件
find ./ -perm /111 -ls
#查找其他用户有执行权限的文件
find ./ -perm /001 -ls
#查找所有用户(u,g,o)都要有写权限的文件
find ./ -perm -222 -ls
#至少有一个用户没有写权限的文件
find ./ -not -perm -222 -ls

处理动作:
-print:输出至标准输出;默认的动作;
-ls:类似于对查找到的文件执行ls -l命令,输出文件的详细信息;
-delete:删除查找到的文件;
-fls /PATH/TO/SOMEFILE:把查找到的所有文件的长格式信息保存至指定文件中;
-ok COMMAND {} ; :对查找到的每个文件执行由COMMAND表示的命令;每次操作都由用户进行确认;
-exec COMMAND {} ; :对查找到的每个文件执行由COMMAND表示的命令;不需要由用户进行确认;

注意:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令;
但是有些命令不能接受过长的参数,此时命令执行会失败;另一种方式可以规避此问题;
find | xargs COMMAND

useradd centos
#给c和e两个设置属主和属组为centos
chown centos:centos c e
#删除用户
userdel -r centos
#将没有属主和属组的用户设置为root;其中{}是占位符表示引用找到文件的列表;其中的\;是固定格式
find ./ -nouser -a -nogroup -exec chown root:root {} \;
#将其他用户有写权限的文件加上后缀.danger
find ./ -perm /002 -exec mv {} {}.danger \;

练习:
1、查找/var目录下属主为root,且属组为mail的所有文件或目录;

find /var -user root -group mail -ls

2、查找/usr目录下不属于root,bin或hadoop的所有文件或目录;用两种方法;

find /usr ! -user root -a ! -user bin -a ! -user hadoop -ls
find /usr ! \( -user root -o  -user bin -o  -user hadoop \) -ls

3、查找/etc目录下最近一周内其内容修改过,且属主不是root的用户也不是hadoop用户的文件或目录;

find /etc -mtime -7 -a ! \( -user root -o -user hadoop \) -ls

4、查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或目录;

find / \( -nouser -o -nogroup \) -a -atime -7 -ls

5、查找/etc目录下大于1M且类型为普通文件的所有文件;

find /etc -size +1M -a -type f -ls
#也可以使用-exec来执行ls -lh命令
find /etc -size +1M -a -type f -exec ls -lh {} \;

6、查找/etc目录下所有用户都没有写权限的文件;

find /etc -not -perm /222 -a -type f -exec ls -lh {} \;

7、查找/etc目录至少有一类用户没有执行权限的文件;

find /etc -not -perm -111 -a -type f -exec ls -lh {} \;

8、查找/etc/init.d/目录下,所有用户都有执行权限,且其他用户有写权限的所有文件;

find /etc/init.d/ -perm -113 -a -type f -exec ls -lh {} \;

Linux系统上的特殊权限

特殊权限:SUID、SGID、STICKY

安全上下文:
1、进程以某用户的身份运行;进程是发起此进程用户的代理,因此以此用户的身份和权限完成所有操作;
2、权限匹配模型:
(1) 判断进程的属主,是否为被访问的文件属主;如果是,则应用属主的权限;否则进入第2步;
(2) 判断进程的属主,是否属于被访问的文件属组;如果是,则应用属组的权限;否则进入第3步;
(3) 应用other的权限;

SUID:
默认情况下:用户发起的进程,进程的属主是其发起者;因此,其以发起者的身份在运行;
SUID的功用:用户运行某程序时,如果此程序拥有SUID权限,那么程序运行此进程时,进程的属主不是发起者,而是程序文件自己的属主;

管理文件的SUID权限:
chmod u+|-s FILE...

展示位置:属主的执行权限位
如果属主原本有执行权限,显示为小写s;否则,显示为大写S;

#复制cat命令
cp /usr/bin/cat /tmp
#查看权限
ll /tmp/cat
#设置cat未SUID
chmod u+s /tmp/cat
#查看权限
ll /tmp/cat
#从root切换用户至hadoop
su - hadoop
#使用SUID权限的cat,就可以查看/etc/shadow文件了,因为它会使用程序文件自己的属组
/tmp/cat /etc/shadow

SGID:
功用:当目录属组有写权限,且有SGID权限时,那么所有属于此目录的属组,且以属组身份在此目录中新建文件或目录时,新文件的属组不是用户的基本组,而是此目录的属组;

管理文件的SGID权限:
chmod g+|-s FILE...

展示位置:属组的执行权限位
如果属组原本有执行权限,显示为小写的s;否则为大写的S;

#添加fedora和centos
useradd fedora
useradd centos
#设置附加组为mygrp
usermod -a -G mygrp centos
usermod -a -G mygrp fedora
#查看附加组
id centos
id fedora
#创建文件夹
mkdir /var/temp/test
#设置该文件夹属组为mygrp且有写权限
chown :mygrp /var/tmp/test
chmod g+w /var/tmp/test/
#设置SGID
chmod g+s /var/tmp/test
#查看该文件夹权限
ll -d /var/tmp/test
#切换用户
su - centos
#创建文件
touch /var/tmp/test/a.centos
#切换用户
su - fedora
#创建文件
touch /var/tmp/test/b.fedora
#查看文件的属组为mygrp,而非自己的基本组(默认是自己的基本组)
ll /var/tmp/test/

Stlcky:
功用:对于属组或全局可写的目录,组内的所有用户或系统上的所有用户对在此目录中都能创建新文件或删除所有已有文件;如果为此类目录设置stlcky权限,则每个用户能创建新文件,且只能删除自己的文件;

管理文件的stlcky权限:
chmod o+|-t FILE...

展示位置:其他用户的执行权限位
如果其他用户原本有执行权限,显示为小写的T;否则为大写的T;

系统上的/tmp和/var/tmp目录默认均有stlcky权限;如:/tmp默认777权限,但是加了stlcky权限,用户可以在此文件夹内创建文件,只能删除自己创建的文件,不能删除别人创建的文件;

管理特殊权限的另一方式:
基于八进制方式赋权时,可于默认的三位八进制数字左侧再加一位八进制数字;
例如:chmod 1777;设置777且有stlcky权限;

facl:访问控制列表(file access control lists)

文件的额外赋权机制:
在原来的u,g,o之外,另一层让普通用户能控制赋权给另外的用户或组的赋权机制;

getfacl命令:
getfacl FILE...
user:USERNAME:MODE
group:GROUPNAME:MODE

setfacl命令:
赋权给用户:
setfacl -m u:USERNAME:MODE FILE...
赋权级组:
setfacl -m g:GROUPNAME:MODE FILE...

撤销赋权:
setfacl -x u:USERNAME FILE...
setfacl -x g:GROUP FILE...

#切换centos用户
su - centos
cd /tmp
#创建文件
touch test.centos
#查看属主和属组都是centos
ll test.centos
#切换fedora用户
su - fedora
#提示权限不够
echo hello > /tmp/test.centos
#普通用户fedora想给其他用户附加权限需要使用facl,#切换用户至centos
su - centos
#请看下图,设置额外权限

#切换用户至fedora
su - fedora
#将hello重定向到test.centos文件
echo hello > /tmp/test.centos
cat /tmp/test.centos

对属组设置权限列表

设置指定用户权限列表没有权限


登录hadoop用户,没有就没有读的权限了

取消hadoop权限列表的权限

hadoop用户就可以正常读取了,这时他使用的是其他用户的权限

Shell
1
https://gitee.com/abcd1234567_1/linux.git
git@gitee.com:abcd1234567_1/linux.git
abcd1234567_1
linux
Linux学完就忘系列
master

搜索帮助