Linux07 文件查找(locate、find )及特殊权限(SUID、SGID、Sticky)

文件查找

locate

locate:非实时,模糊匹配,查找是根据全系统文件数据库进行的;速度快。
# updatedb,手动生成文件数据库

安装locate命令:

更新locate数据库:

find

find:实时查找,精确,遍历指定目录中的所有文件完成查找,速度慢;支持众多查找标准(文件名、文件权限、文件类型、基于正则表达式对文件名做匹配的查找),很强大。

# 用法
find 查找路径 查找标准 查找到以后的处理运作
查找路径: 默认为当前路径
查找标准:默认为指定路径下的所有文件,包括隐藏文件
处理运作:默认为显示

匹配标准:
	-name 'FILENAME':对文件名做精确查找
		find /etc -name 'passwd'
	
        文件名通配:
            *:任意长度的任意字符
            find /etc -name 'passwd*' # 以passwd开头的文件
            find /etc -name '*passwd' # 以passwd结尾的文件
            find /etc -name '*passwd*' # 文件名中包含passwd的文件
            ?:
            []:
	-iname 'FILENAME':文件名匹配时不区分大小写
	-regex PATTERN: 基于正则表达式进行为文件名匹配
	-user USERNAME:根据属主查找
        find /tmp -user user1
	-group GROUPNAME:根据属组查找
        
    -uid UID:根据UID查找
        如果用户被删除(userdel -r 用户名),用户在/tmp下创建的文件的属主的名称就会变成当初创建用户时的uid,所以这时如果再查找这个被删除用户/tmp下的文件时,只能根据uid查找;
        find /tmp -uid 1000
        
	-gid GID:根据GID查找
        find /tmp -gid 1000
	
	-nouser:查找没有属主的文件
		find /tmp -nouser
	-nogroup:查找没有属组的文件
        find /tmp -nogroup
	-type 要查找的类型
    	f:普通文件
	    d:目录
        c:字符设备
        b:块设备
	    l:连接文件
        p:管道设备
        s:套接字设备

		find /tmp -type d
		find /tmp -type s
	-size: 文件尺寸
		K,M,G 文件大小单位
        +nK,+nM,+nG  # 表示查找大于n k、M、G的文件
		find /etc -size 1k # 所有小于1K的文件
		find /etc/ -size 10M # 显示所有在9~10M之间的文件,或者略大于10M的文件,都默认是10M的文件
		find /etc/ -size 10k -ls # 查找/etc下9k~10k之间,或略大于10k的文件,并显示文件尺寸
		find /etc -size +10k -ls # 查找大于10k的文件按
		find /etc -size -10k -ls # 查找小于10k的文件 

组合查找条件:
	-a:与关系
	-o:或关系
    -not:非关系
	find /tmp/ -nouser -a -type d -ls
	find /tmp -uid 1000 -a -nouser -ls
	find /tmp -nouser -o -type d  -ls
	find /tmp -not -type d

	/tmp目录,不是目录,并且还不是套接字类型的文件
	find /tmp -not -type d -a -not-type s  || find /tmp -not ( -type d -o -type s )

    属主不是user1,或者类型(-type)不是目录:
	find ./ -not -user user1 -o -not -type d
	find ./ -not ( -user user1 -a -type d )
根据时间查找:
-mtime:在这个时间修改了
-ctime:在这个时间改变了
-atime:在这个时间访问了
    find /tmp -atime +30  # 30天内没访问
	[+|-]#
    eg: 
        +7:表示至少有7天没访问了
        -7:表示在七天内有访问
        7:在
-mmin
-cmin
-amin
	[+|-]#
    find /tmp -admin 5
    find /tmp -admin +5
    eg: 
        +7:表示至少有7分钟没访问了
        -7:表示在7分钟内有访问
        7:刚好在第5分钟的时候访问了

-perm MODE: 精确匹配
	/MODE:任意一位匹配即满足条件,每一位之间是或关系
    -MODE: 文件权限能完全包含此MODE时才能显示,每一位之间是与关系
    
    -644: rw-r--r--
    
    644:
    755: rwxr-xr-x  # 可以
    750: rwxr-x---  # 
    find ./ -perm -644  # 文件权限是644、755的完全包含644,所以会被显示出来


动作:
	-print: 默认是print,显示出来
    -ls:类似ls -l的形式显示每一个文件的详细信息
	-ok COMMAND {} ;  # 每一次操作都需要用户确认
    -exec COMMAND {} ;  # 不需要用户确认   使用时需要{}占位符

	find ./ -prem -006 -exec chmod o-w {} ;  # {}表示find命令找到的符合的文件名,;固定格式
	find ./ -type d -ok chmod +x {} ;

	查找属组有写权限的文件并给文件名添加后缀.new
	find ./ -perm -020 -exec mv {} {}.new ;
	找到当前文件夹下的.sh结尾的文件,并将other用户的执行权限去掉;
    find ./ -name '*.sh' -exec chmod o-x {} ;
	找到当前文件夹下以.sh结尾的文件,并且所有角色(u,g,o)都有执行权限的文件的other执行权限去掉
	find ./ -name '*.sh' -a -perm -111 -exec chomod o-x {} ;

用户被删除,根据用户的UID查找用户之前再/tmp下创建的文件:

查看某个文件夹中没有属主和属组的文件,在没有属主和属组的文件,为了防止普通用户也能访问,最好时把权限收回,防止这种漏洞导致其他用户也能操作此文件。

根据类型查找:

根据文件尺寸查找文件:

组合条件查找:

find练习

1.查找/var目录下属主为root并且属主为mail的所有文件;
find /var -user root -a -group mail

2.查找/usr目录下不属于root,bin,或student的文件;
find /usr -not -user root -a -not -user bin -a -not -user student
find /usr -not ( -user root -o -user bin -o -user student )

3.查找/etc目录下最近一周内内容修改过且不属于root及student用户的文件;
find /etc -mtime -7 -a -not ( -user root -o -user -student )
find /etc -mtime -7 -not -user root -a -not -user student

4.查找当前系统上没有属主或属组且最近1天内曾被访问过的文件,并将其属主属组均修改为root;
find ( -nouser -o -nogroup ) -a -atime -1 -exec chown root:root {} ;

5.查找/etc目录下大于1M 的文件,并将其文件名写入/tmp/etc.largefiles文件中;
find /etc -size +1M >> /tmp/etc.largefiles 
find /etc -size +1M exec echo {} >> /tmp/etc.largefiles ;
find /etc -size +1M | xargs echo >> /tmp/etc.largefiles  # xargs比exec要强大,不需要占位符,也不需要结束符;  但是需要管道 | 将执行后的命令传给xargs,xargs后跟要执行的命令 

6.查找/etc目录下所有用户都没有写权限的文件,显示出其详细信息;
find /etc -not -prem -222 -ls 

特殊权限(SUID、SGID、Sticky)

SUID:运行某程序时,相应进程的属主是程序文件自身的属主,而不是这个进程的发起者(启动者);
    管理员账户的属主添加s权限,之后其他用户也将拥有执行权限:
    比如:
    chmod u+s /bin/cat # 在管理员账户下添加属主权限s
    本来只有管理员才有的查看/etc/shadow的权限,现在普通用户也将能查看这个文件了,这回带来极大安全隐患;所以这个s权限不要随意添加。
    su - 普通用户
    cat /etc/shadow  # 添加s权限之前没权限,现在也能查看这个文件了。
    那为什么我们的 passwd命令有s权限呢?因为普通用户也有自己修改密码的需求
	去掉s权限:
		su - root
		chmod u-s /bin/cat
		
		
SGID:运行某程序时,相应进程的属组是程序文件自身的属组,而不是这个进程的发起者所属的属组(启动者);
chmod g+s FILE
chmod g-s FILE
现有如下场景:
	有以下用户,develop  team  hadoop hbase  hive,建立一个临时文件,这些用户都可以往 /tmp/project这个文件中写,甚至root用户建立一个文件,其他用户也都能往这个文件按中写,如何实现?
	useradd hbase
	useradd hadoop
	useradd hive
	mkdir /tmp/project
	groupadd developteam 
	chown -R :developteam /tmp/project # 递归的方式将project文件夹及其下的文件和文件夹的属组都修改为developteam
	usermod -a -G developteam hadoop  # 修改附加组,在原有的附加组基础之上添加新的组  -a -G 联用
	usermod -a -G developteam hbase
	usermod -a -G developteam hive
	
	su - hadoop
	cd /tmp/project
	touch a.hadoop # 没有写权限,创建不了;需要给project添加一个写权限,这个权限只能root用户可以添加,所以要切换到root用户。
	su - root
	chmod g+w /tmp/project
	su - hadoop
	touch /tmp/project/a.hadoop
	su - hbase
	touch /tmp/project/a.hbase
	此时,hadoop用户所创建的的文件的属组是hadoop,hbase用户创建的文件的属组是hbase,hadoop不能编辑hbase用户创建的文件,hbase也不能编辑hadoop创建的文件;怎么办?
	su - root
	chmod g+s /tmp/project/  # 组加上s全限
	ls -ld /tmp/project
	drwxrwsr-x  2 root  developteam 4096 Mar  7 17:58 /tmp/project .
	su - hadoop
	cd /tmp/project
	touch b.hadoop
	ls -l
	-rw-rw-r-- 1 hadoop  developteam 0 Mar 7 17:21 b.hadoop # 在project目录下创建的文件或文件夹不再是用户的基本组,而是目录的基本组。当访问某个目录或者某个文件的时候,不再以自己的属主和基本组为身份,而以这个文件自身的属主和基本组作为其身份。
	
	su - hbase
	cd /tmp/project
	touch b.hbase
	ls -l
	-rw-rw-r-- 1 hbase  debelopteam 0 Mar 7 17:58 b.hbase  # 在project目录下创建的文件或文件夹不再是用户的基本组,而是目录的基本组。当访问某个目录或者某个文件的时候,不再以自己的属主和基本组为身份,而以这个文件自身的属主和基本组作为其身份。
	此时,hbase 和 hadoop 两个用户在project文件夹下创建文件和文件夹都可以相互访问和编辑了。但是,有一个坏处,就是当前用户还可以删除别人创建的目录和文件,需要用下面的Sticky做进一步处理。
	
	
Sticky:在一个公共目录,每个人都能创建文件,删除自己的文件,但是不能删除别人创建的文件。
	chmod o+t DIR
	chmod o-t DIR
	root用户下:
		chmod o+t /tmp/project
		
		ls -ld /tmp/project
		drwxrwsr-t 2 root debelopteam 4096 Mar   7 18:02  /tmp/project  # 在o上有t了,原有执行权限小写t,否则大写T
		切换到普通用户hadoop,删除hbase在/tmp/project创建的文件:
			rm b.hbase
			rm: cannot remove 'b.hbase':Operation not permitted.
			rm b.hadoop # 可以删除自己在/tmp/project创建的b.hadoop

000:0
001: 1 #有Sticky
010: 2 # GUID
011: 3 # SGID和Sticky
100: 4 # SUID
101: 5 # # SUID和Sticky
110: 6 # 有SUID、SGID,没有Sticky
111: 7 # 有SUID、SGID、Sticky
chmod 1755 /backup/test  # 表示test目录的权限是1755,1表示Sticky
chmod 2755 /backup/test # 带SGID
chmod 3755 /backup/test  # 带SGID和Sticky
chmod 5755 /backup/test  # SUID+Sticky

所以,
umask 0022 的第一位0对应的就是SUID、SGID、Sticky
原文地址:https://www.cnblogs.com/zhangchaocoming/p/14697898.html