在 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"
填写USERNAME
并DIRECTORY
视情况而定。
答案3
此命令应该找到所有可写的目录,您可以根据需要更改权限:
find / -type d \( -perm -g+w -or -perm -o+w \) -exec ls -adl {} \;
答案4
对于 Eddie 的回答,您可以补充:
my $path = quotemeta shift;
然后它将遍历名称中带有空格的目录。