如何找到特定用户可写的所有文件和目录?

如何找到特定用户可写的所有文件和目录?

在 Linux 下,如何找到特定用户可写(或实际上不可写)的所有文件和目录?

编辑:澄清一下,我的意思是在特定子目录下,而不是系统范围内。是的,这意味着允许该用户写入的用户、组和世界可写性的所有排列和组合。我知道这个问题在语义上意味着什么,我希望执行一行或几行来获取这些文件的列表。

答案1

如果您安装了 findutils 4.3.0 或更高版本,请使用“find”命令:

对于当前目录下所有当前用户可写入的文件:

find . -writable

对于当前目录下所有当前用户不可写入的文件:

find . ! -writable

根据手册页:

这个测试使用了 access(2) 系统调用,因此可能会被执行 UID 映射(或根压缩)的 NFS 服务器所欺骗,因为许多系统在客户端的内核中实现 access(2),因此无法使用服务器上保存的 UID 映射信息。

答案2

writable.pl您可以创建一个这样的Perl 脚本 ( ):

#!/usr/bin/perl

use strict;

sub recurse {
  my $path = shift;
  my @files = glob "$path/{*,.*}";
  for my $file (@files) {
    if (-d $file) {
      if ($file !~ /\/\.$/ && $file !~ /\/\.\.$/) {
        recurse($file);
      }
    } else {
      print "$file\n" if -w $file;
    }
  }
}

print "Writable files for " . getlogin() . "\n";
recurse($ARGV[0]);

然后以 root 身份使用该脚本,如下所示:

su USERNAME -c "./writable.pl DIRECTORY"

填写USERNAMEDIRECTORY视情况而定。

答案3

此命令应该找到所有可写的目录,您可以根据需要更改权限:

find / -type d \( -perm -g+w -or -perm -o+w \) -exec ls -adl {} \;

答案4

对于 Eddie 的回答,您可以补充:

my $path = quotemeta shift;

然后它将遍历名称中带有空格的目录。

相关内容