zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    SQLLoader7(只导入数据文件的其中几行记录)
    SQLLoader6(一个或多个数据文件按条件导入不同的表)
    SQLLoader5(从多个数据文件导入到同一张表)
    SQLLoader4(数据文件中的列与表中列不一致情况-filler)
    SQLLoader3(数据文件没有分隔符时的导入)
    SQLLoader2(导入EXCEL或csv格式的文件)
    SQLLoader1(简单测试,以控制文件方式导入数据)
    可编程内存
    JSONP
    SSL协议
  • 原文地址:https://www.cnblogs.com/zhangchaocoming/p/14697898.html
Copyright © 2011-2022 走看看