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

在Linux下,我怎样才能find所有的文件和目录是由一个特定的用户可写(或,实际上,不可写)?

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

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

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

find . -writable 

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

 find . ! -writable 

根据手册页:

这个testing利用了访问(2)系统调用,所以可以被执行UID映射(或root-squashing)的NFS服务器愚弄,因为许多系统在客户内核中实现访问(2),所以不能利用保存在服务器上的UID映射信息。

你可以像这样创build一个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]); 

然后使用这个脚本,作为根,如下所示:

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

根据需要填入USERNAMEDIRECTORY

你确定这确实是你想问的问题吗?

要说“我想查看X帐户可以写入的所有文件”是指用u + w拥有的每个文件,属于它们的任何组拥有的每个文件都被设置为g + w,并且每个文件世界都可写(o + W)。

不可写是更难的。 你最好列出每个文件,然后排除他们可以写入的文件。

对于艾迪的回答,如果你投入:

 my $path = quotemeta shift; 

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

在这个例子中,我将使用-perm标志的gnu查找语法:

基本上 – 如果你抛出像ACL这样古怪的扩展,你就有3个chocies – 拥有者,组和其他的“写入权限”。 听起来像一个循环的工作。

有足够的空间来优化这个,但我会把它留给别人…另外,我永远不能记住所有的发现和交叉文件系统的细节和那种无稽之谈。 此外,请确保组的输出与我的testingLinux系统上的相同

 $ groups snoopy snoopy : snoopy doghouse linus admin wwI woodstock $ 

这是如何find用户可写的文件的粗略例子。 这将以任何用户身份运行,但是如果以非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开关,这也可以否定

编辑:思考更多关于这个,这个脚本打印什么是可写的当前用户,它显然不会为一些给定的用户工作。