在Linux下,如何找到特定用户可写(或实际上不可写)的所有文件和目录?
编辑:澄清一下,我的意思是在特定的子目录下,而不是系统范围内。是的,这意味着允许用户进行书写的用户,组和世界可写性的所有排列和组合。我知道这个问题在语义上意味着什么,我希望执行一个或几行代码来获取这些文件的列表。
在Linux下,如何找到特定用户可写(或实际上不可写)的所有文件和目录?
编辑:澄清一下,我的意思是在特定的子目录下,而不是系统范围内。是的,这意味着允许用户进行书写的用户,组和世界可写性的所有排列和组合。我知道这个问题在语义上意味着什么,我希望执行一个或几行代码来获取这些文件的列表。
Answers:
如果安装了findutils 4.3.0或更高版本,请使用“查找”命令:
对于当前用户可写的当前目录下的所有文件:
find . -writable
对于当前用户不可写的当前目录下的所有文件:
find . ! -writable
根据手册页:
该测试利用了access(2)系统调用,因此可以被执行UID映射(或根压缩)的NFS服务器所欺骗,因为许多系统在客户端的内核中实现了access(2),因此无法利用服务器上保存的UID映射信息。
2>&1 | grep -v "Permission denied"
为find . -writable 2>&1 | grep -v "Permission denied"
您可以这样创建一个Perl脚本(writable.pl
):
#!/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
视情况填写。
对于埃迪的答案,如果您输入:
my $path = quotemeta shift;
然后,它将遍历目录名称中也带有空格的目录。
在此示例中,我将对-perm标志使用gnu find语法:
基本上-如果扔掉像ACL这样古怪的扩展名,则有3个选择-所有者,组和“其他”写访问权限。听起来像是循环工作。
有足够的空间来优化此功能,但我会将其留给其他人...另外,我永远也不会记住查找和交叉文件系统的所有详细信息以及此类废话。另外,请确保组的输出与我的测试linux系统上的输出相同
$ groups snoopy
snoopy : snoopy doghouse linus admin wwI woodstock
$
这是一个如何查找用户可写文件的粗略示例。这将以任何用户身份运行,但是如果以非uid0用户身份运行,则只会在运行脚本的用户具有读取和执行权限的目录中找到内容。
#!/bin/sh
user=snoopy
directory=/
# first files owned by the user and writable
find "$directory" -follow -user "$user" -perm /u+w 2> /dev/null
# now for files that are group writable with the user in that group
for groups in $(groups snoopy 2> /dev/null | cut -f2 -d:)
do
find "$directory" -follow -group "$user" -perm /g+w 2> /dev/null
done
# now for everything else
find "$directory" -follow -perm /o+w 2> /dev/null
我不确定这是否是最好的方法,但是应该按照您的要求进行:
for file in *
do
if [ -w $file ] ; then
echo $file
fi
done
钥匙当然在-w
开关上,也可以取反
编辑:对此进行更多思考,此脚本将打印当前用户可写的内容,对于某些给定用户显然不起作用。