AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 17364
Accepted
Pistos
Pistos
Asked: 2009-06-02 16:04:03 +0800 CST2009-06-02 16:04:03 +0800 CST 2009-06-02 16:04:03 +0800 CST

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

  • 772

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

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

linux users find
  • 8 8 个回答
  • 45195 Views

8 个回答

  • Voted
  1. Best Answer
    Ophidian
    2009-06-02T17:38:28+08:002009-06-02T17:38:28+08:00

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

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

    find . -writable
    

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

    find . ! -writable
    

    根据手册页:

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

    • 23
  2. Eddie
    2009-06-02T17:28:37+08:002009-06-02T17:28:37+08:00

    您可以像这样创建一个 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酌情。

    • 3
  3. chris
    2009-06-24T07:43:43+08:002009-06-24T07:43:43+08:00

    在此示例中,我将使用 gnu find 语法作为 -perm 标志:

    基本上——如果你抛弃像 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
    
    • 2
  4. Boschko
    2018-05-24T12:19:18+08:002018-05-24T12:19:18+08:00

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

    find / -type d \( -perm -g+w -or -perm -o+w \) -exec ls -adl {} \;
    
    • 2
  5. user23079
    2009-10-16T08:56:16+08:002009-10-16T08:56:16+08:00

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

    my $path = quotemeta shift;
    

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

    • 1
  6. Matt Simmons
    2009-06-02T16:07:28+08:002009-06-02T16:07:28+08:00

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

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

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

    • 0
  7. Slartibartfast
    2009-06-02T16:47:30+08:002009-06-02T16:47:30+08:00

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

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

    key当然在-wswitch,也可以取反

    编辑:更多地考虑这一点,这个脚本打印当前用户可写的内容,它显然不适用于某些给定用户。

    • 0
  8. Dmytro Brazhnyk
    2022-07-02T08:01:40+08:002022-07-02T08:01:40+08:00

    Linuxtest -w /foldername/filename可以检查当前用户是否对文件有写权限。如果有,则该过程返回 0,如果没有,则返回非零。

    作为 admin 或 root,您可以代表用户登录,并将 test 命令与 find命令组合,因此命令列表如下所示:

    sudo su username
    find /folder/subfolder -exec test -w {} \; -exec echo {} \; 2>/dev/null
    
    

    运行每个文件都很慢,test -w但是会检查它是否可以写

    • 0

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve