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


10

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

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


好的,谢谢大家的回答。我已经通过Google找到了“查找”解决方案,但想知道是否有某种方法可以将其通用地应用于给定用户。看起来除了以su身份作为用户,然后再运行find命令,别无其他方法-除非其他任何人成功了?除非有任何更好的答复,否则我明天会接受Ophidian的回答。
Pistos

Answers:


18

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

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

find . -writable

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

find . ! -writable

根据手册页:

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


4
只是以为我提到了进一步的启发:实际上,我必须对没有登录shell(/ sbin / nologin)的用户执行此操作。为此,我使用了sudo,就像这样:sudo -u nobody find。!可写
Pistos

这不能回答问题,因此不应被接受。问题是关于“特定用户”,而不是“当前用户”。
jlh

并隐藏权限被拒绝的错误添加2>&1 | grep -v "Permission denied"find . -writable 2>&1 | grep -v "Permission denied"
iolsmit

3

您可以这样创建一个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"

USERNAMEDIRECTORY视情况填写。


优秀的。谢谢。$ ARGV [0]在CentOS 6.2的bash shell中被当作空。不知道为什么。我修改了脚本以从文件读取。
2013年

1

您确定这确实是您要提出的问题吗?

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

不写将更加困难。您最好列出每个文件,然后排除它们可以写入的文件。


3
当然,如果系统启用了ACL,则更加复杂。
Zoredache

2
不算chattr命令+我的文件
西蒙斯

1

对于埃迪的答案,如果您输入:

my $path = quotemeta shift;

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


1

在此示例中,我将对-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

1

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

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

0

我不确定这是否是最好的方法,但是应该按照您的要求进行:

for file in *
do 
    if [ -w $file ] ; then 
        echo $file
    fi
done

钥匙当然在-w开关上,也可以取反

编辑:对此进行更多思考,此脚本将打印当前用户可写的内容,对于某些给定用户显然不起作用。


当然,您必须以该用户身份运行此脚本。
Eddie

是的,想通了...
Slartibartfast,2009年

您将如何在perl中编写此代码?
ealeon '18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.