根据文件属性或权限进行find查找

原文发表于《网络安全和信息化》2017年第3期,现转发到博客。

讲课过程中发现对find命令-perm选项的理解有些偏差,将相关内容修订之后发布在新的博客上,http://blog.51cto.com/yttitan/2306703 


findLinux系统中功能强大的文件查找命令,它可以实现文件的精确查找,是在日常运维工作中最常使用的命令之一。find命令支持的查找条件非常多,用法也比较复杂,其中按文件属性或是权限进行查找就是一种相对较为高级的find查找方法,很多初学者往往对这两种查找方法理解和掌握不够透彻,本文就分别梳理了如何来设定和使用这两种查找条件。

1.    根据文件属性查找

文件属性主要是指文件的所有者和所属组这两种所属关系。按文件属性查找,主要有以下选项:

l  -user 用户名:根据所有者查找;

l  -group 组名:根据所属组查找;

l  -uid UID:根据UID查找;

l  -gid GID:根据GID查找;

l  -nouser:查找没有所有者的文件;

l  -nogroup:查找没有所属组的文件。

例:在/home目录下查找所有属于用户student的文件或目录。


[root@localhost    ~]# find /home -user student -ls

400903    4 drwx------   4 student  student      4096 9     8 16:33 /home/student

400904    4 -rw-r--r--   1 student  student 176 1 16 2015  home/student/.bash_profile

……


例:在/var目录中查找所有者为root且所属组为mail的文件或目录。


[root@localhost    ~]# find /var -user root -group mail    -ls

655309    4 drwxrwxr-x   2 root     mail         4096 12 23 11:24 /var/spool/mail


有时可能会遇到这样的情况,比如文件/tmp/test属于zhangsan所有,如果将用户zhangsan删除,那么/tmp/test的所有者和所属组就变成了zhangsan原先的uidgid


[root@localhost    ~]# ll /tmp/test                                 //文件属于zhangsan

-rw-r--r--. 1    zhangsan zhangsan 0 12 23 05:59 /tmp/test

[root@localhost    ~]# userdel -r zhangsan                 //删除zhangsan用户

[root@localhost    ~]# ll /tmp/test                                 //文件的所有者和所属组变成了uidgid

-rw-r--r--. 1    504 504 0 12 23 05:59 /tmp/test


这时我们也可以通过uidgid去查找这类文件。


[root@localhost    ~]# find /tmp -uid 504 -ls

797189    0 -rw-r--r--   1 504      504             0 12 23 12:12 /tmp/test


其实对于那些正常的所属关系是用户名或组名的文件,同样也可以通过uid或是gid进行查找。比如用户studentuid500,我们通过uid/home目录中查找属于student的文件。


[root@localhost    ~]# find /home -uid 500 -ls

400903    4 drwx------   4 student  student      4096 9     8 16:33 /home/student

400904    4 -rw-r--r--   1 student  student     176 1 16 2015 /home/student/.bash_profile

……


对于/tmp/test这样的所有者和所属组变成了uidgid的文件,就称为没有所有者或所属组的文件,这样的文件在系统中有一定危险性,所以我们可以通过-nouser-nogroup选项去查找这类文件。找到这类文件之后,最好是利用chown命令重新为其指定所有者和所属组。


[root@localhost    ~]# find /tmp -nouser -ls

797189    0 -rw-r--r--   1 504      504             0 12 23 12:12 /tmp/test

[root@localhost    ~]# find /tmp -nogroup -ls

797189    0 -rw-r--r--   1 504      504             0 12 23 12:12 /tmp/test


2.    根据文件权限查找

按文件权限查找,需要用到-perm选项,根据对权限的设置条件不同,该选项又分为三种用法:

l  -perm mode:精确匹配mode所表示的条件。

l  -perm /mode:任何一类用户(ugo)的权限中的任何一位(rwx)符合mode所表示的条件即可,9位权限之间存在“或”关系。

l  -perm -mode:任何一类用户(ugo)的权限中的每一位(rwx)都要同时符合mode所表示的条件,9位权限之间存在“与”关系。

例如,要在/boot目录中查找权限为755的普通文件,并显示详细信息。我们设置查找条件为“-perm 755”,可以发现共找到两个文件,这两个文件的权限都对查找条件进行了精确匹配。


[root@localhost    ~]# find /boot -perm 755 -type f -ls

 65030     250 -rwxr-xr-x   1 root   root     254248 4 7  2015    /boot/efi/EFI/redhat/grub.efi

 16 4125 -rwxr-xr-x  1 root     root  4222192 7 2 2015    /boot/vmlinuz-2.6.32-573.el6.x86_64


下面继续在/boot目录中查找权限为750的目录,但是没有查找到任何符合条件的结果。


[root@localhost    ~]# find /boot -perm 750 -type d -ls


将查找条件修改为“-perm /750”,表示任何一个目录只要其所有者具有读写执行中的任何一项权限,或是其所属组具有读和执行中的任何一项权限,就可以符合查找条件。需要注意的是,查找条件中的0表示忽略对相应对象的权限要求,而不是指没有任何权限。重新指定查找条件后,就可以找到很多符合要求的目录。


[root@localhost    ~]# find /boot -perm /750 -type d    -ls

     2       2 dr-xr-xr-x   5 root     root         1024 9     2 00:36 /boot

    11      13 drwx------   2 root     root        12288 9     2 00:24 /boot/lost+found

 65027       2 drwxr-xr-x   3 root     root         1024 9     2 00:33 /boot/efi

……


下面再将查找条件修改为“-perm -750”,表示所要查找的目录其所有者必须具有读写执行权限,同时其所属组必须具有读和执行权限,对其他用户的权限没有要求。从查找结果中可以发现,之前通过条件“-perm /750”所查找出来的两个目录“/boot”和“/boot/lost+found”,此时都不在查找结果之列。


[root@localhost    ~]# find /boot -perm -750 -type d    -ls

 65027       2 drwxr-xr-x   3 root     root         1024 9     2 00:33 /boot/efi

 65028       2 drwxr-xr-x   3 root     root         1024 9     2 00:33 /boot/efi/EFI

 65029       2 drwxr-xr-x   2 root     root         1024 9     2 00:33 /boot/efi/EFI/redhat


所以如果要在系统中查找所有人都有写权限的目录,则应该指定条件“-perm -222”,如果以“-perm /222”为查找条件,则是所有者、所属组或其他用户中任何一个具有写权限都会符合要求。


[root@localhost    ~]# find / -perm -222 -type d -ls    2> /dev/null

  6810       0 drwxrwxrwt   2 root     root          100 12 23 03:37 /dev/shm

654108    4 drwxrwxrwt   2 root     root         4096 12 23 03:42 /var/tmp

784897    4 drwxrwxrwt  12 root     root         4096 12 23 06:58 /tmp

……


除了读写执行这些常规权限之外,Linux系统还提供了特殊权限SUIDSGID,它们所对应的数字分别是42。如果要在系统中查找所有设置了SUID的文件,应指定条件“-perm -4000”。


[root@localhost    ~]# find / -perm -4000 –ls 2>    /dev/null

788976   40 -rwsr-xr-x   1 root        root        38200 12 11     2014 /bin/ping

788990   76 -rwsr-xr-x   1 root     root        77336 8 11     2014 /bin/mount

……


如果要查找所有设置了SGID的文件,应指定条件“-perm -2000”。


[root@localhost    ~]# find / -perm -2000 –ls 2>    /dev/null

784944   16 -rwxr-sr-x   1 root        cgred       16384 1     6  2015 /bin/cgexec

784971   16 -rwxr-sr-x   1 root     cgred       16352 1     6  2015 /bin/cgclassify

……


如果要同时查找所有设置了SUID或是SGID的文件,那么应该指定条件“-perm /6000”,如果将条件指定为“-perm -6000”,则表示查找既设置了SUID也设置了SGID的文件,而这样的文件在系统中是不存在的。


[root@localhost    ~]# find / -perm -6000 –ls 2>    /dev/null

 //查找同时设置了SUIDSGID的文件,没有结果。

[root@localhost    ~]# find / -perm /6000 –ls 2>    /dev/null

//查找设置了SUID或是SGID的文件

788976   40 -rwsr-xr-x   1 root     root        38200 12 11     2014 /bin/ping

788990   76 -rwsr-xr-x   1 root     root        77336 8 11     2014 /bin/mount

……


 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Linux中,可以使用以下命令根据文件名查找文件: 1. find命令:可以根据文件名、文件类型、文件大小等多种条件进行查找。例如,查找当前目录及其子目录下所有名为test.txt的文件,可以使用以下命令: ``` find . -name test.txt ``` 2. locate命令:可以快速查找文件,但需要先更新文件索引库。例如,查找名为test.txt的文件,可以使用以下命令: ``` sudo updatedb locate test.txt ``` 3. grep命令:可以在文件中查找指定的字符串或正则表达式。例如,查找当前目录及其子目录下所有包含test字符串的文件,可以使用以下命令: ``` grep -r "test" . ``` ### 回答2: 在Linux系统中,可以使用不同的命令来根据文件名进行文件查找。其中最常用的命令是find和grep。 1. find命令:find命令用于在指定路径下递归搜索文件。可以使用以下命令格式来根据文件名查找文件: find 路径 -name 文件名 示例:要在当前目录下查找名为"example.txt"的文件,可以使用以下命令: find . -name example.txt find命令将会从当前目录开始递归地搜索所有文件和子目录,如果找到匹配的文件,将会输出其绝对路径。 2. grep命令:grep命令用于在文件中搜索指定的字符串模式。虽然更常用于文本搜索,但也可以用于根据文件名搜索。可以使用以下命令格式来根据文件名查找文件: ls 路径 | grep 文件名 示例:要在当前目录下查找名为"example.txt"的文件,可以使用以下命令: ls | grep example.txt ls命令将会列出当前目录下的所有文件和目录,通过管道(|)将这些结果传递给grep命令,grep命令将会筛选出匹配的文件名。 无论是使用find命令还是grep命令,都可以根据文件名查找需要的文件。这些命令还提供了许多其他选项,可以根据文件的不同属性进行更精确的搜索,如文件类型、大小或修改时间等。通过结合使用这些命令的选项,可以实现更复杂的文件查找操作。 ### 回答3: Linux系统中,可以使用以下命令根据文件名进行查找: 1. find命令:find命令用于在指定目录下按指定条件搜索文件。可以通过使用“-name”选项来根据文件名进行查找。以下是一个示例命令: ``` find /path/to/directory -name "filename" ``` 这将在指定目录下查找名为“filename”的文件。 2. locate命令:locate命令用于在整个系统的数据库中搜索文件。这个命令比较快速,但数据库只会每天更新一次,可能不会包含最新创建的文件。以下是一个示例命令: ``` locate filename ``` 这将在整个系统中查找名为“filename”的文件。 3. grep命令:grep命令用于在文件中搜索指定的字符串或者正则表达式。可以结合使用“-r”选项来递归搜索整个目录,并使用“-l”选项来只返回文件名。以下是一个示例命令: ``` grep -r -l "filename" /path/to/directory ``` 这将在指定目录及其子目录下搜索包含指定文件名的文件。 需要注意的是,以上命令在使用时需要替换相应的文件名、目录路径以及选项。此外,这些命令还可以根据更多条件来进行高级搜索,例如文件的权限、大小等。可以通过查阅命令的文档或者使用命令的帮助选项来获取更多详细信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值