【问题标题】:How to know if a given user has read and/or write permissions for a given path如何知道给定用户是否对给定路径具有读取和/或写入权限
【发布时间】:2012-05-27 09:36:00
【问题描述】:

首先我应该说我认为自己是一个熟练的用户。但是今天我需要自动化这个并且被难住了。

假设我是 root,因此我能够遍历整个文件系统,但我不能运行“sudo”或“su”。

我有一个给定的用户和一个给定的路径。

如何通过 CLI 检查用户是否能够读取和/或写入路径?

我知道这听起来很简单,但请记住:

  • 我们不是,也不能成为用户。
  • 我们不能只依赖最终目录权限,因为路径上更高的权限可能会阻止对最终目录的访问。
  • 在这个继承组的时代,我们也不能只依赖目录组权限。

我假设这不能通过任何命令完成,我需要首先收集所有用户组,然后遍历路径的整个层次结构,检查整个路径的读取权限,然后进行读写为最终目录。不过听起来很贵。

【问题讨论】:

  • 您的假设从这里看起来是有效的。不要忘记目录的执行权限。
  • 我不明白你为什么不能su
  • hop:不管是什么原因,这就是问题所在。 “不能使用 x”不能用“然后使用 x”来回答。如果您想让用户知道他们正在创建的共享是否对他们授予访问权限的用户不可读,那么现实生活中的这个问题就会出现。例如,在创建访客无法读取或写入的访客可访问的共享文件夹(其幕后用户实际上是“nobody”)时。
  • @hop:“我在现实生活中没有这个问题”并不一定等于“这不是现实生活中的问题”。
  • @Eduo:这个网站不是用来拼图的。

标签: shell unix user-permissions directory-permissions


【解决方案1】:

我实际上无法提供完整的答案,也无法为您自己的想法添加任何实质性内容,除了以下内容:

我怀疑不存在检查有效访问权限的通用方法,仅仅是因为访问权限严重依赖于底层文件系统。例如,检查访问权限在使用标准 Unix rwx 标志的文件系统(例如 Linux 的 ext2、ext3)与支持 ACL 的文件系统(例如 XFS 或 NTFS)的工作方式完全不同。

可能有几个特定的​​命令行工具可以为特定的文件系统类型执行您想要执行的操作。 (类比:fsckmkfs 等工具可能存在于每个文件系统类型中。)

尤其是在类 UNIX 操作系统中,各种文件系统都可以挂载在一个大目录结构中,假设只有一种特定的权限机制可能会导致问题。

如果您为这个问题构建自己的解决方案,请先考虑这个事实,然后准确地确定您想要支持的访问权限机制。 (我不确定,但我可以想象 Unix / POSIX 规范将 rwx 访问权限标志规定为每个 Unix 都应支持的最低要求。)

【讨论】:

    【解决方案2】:

    标记我一个脚本大师!

    check_access() {
      checked_file=$1
      target_user=$2
      result=PASS
    
      groups=`id -G $target_user | sed -e 's| | -o -group |g' -e 's|^|\\( -group |' -e 's|$| \\)|'`
    
      while [ $checked_file != / ]; do 
        find $checked_file -maxdepth 0 \
          -type f \( \
            \( -user $target_user -perm 0400 \) \
            -o \( $groups -perm 0040 \) \
            -o -perm 0004 \
          \) -o -type d \( \
            \( -user $target_user -perm 0100 \) \
            -o \( $groups -perm 0010 \) \
            -o -perm 0001 \
          \) >/dev/null 2>&1 || result=FAIL
        checked_file=`dirname $checked_file`
      done
      echo $result
    }
    

    【讨论】:

      【解决方案3】:

      最好的方法是通过用户自己验证:

      if sudo su - $user_to_check -c "[[ -r $path_to_check ]]"
      then echo "$user_to_check can read $path_to_check"
      else echo "$user_to_check can not read $path_to_check"
      fi
      if sudo su - $user_to_check -c "[[ -w $path_to_check ]]"
      then echo "$user_to_check can write $path_to_check"
      else echo "$user_to_check can not write $path_to_check"
      fi
      

      【讨论】:

        【解决方案4】:

        ls -l <file-name or dir-name>

        假设您要检查上传目录的权限。输入 ls -l uploads 这将是这样的结果

        total 20
        drwxrwxr-x 2 tomcat ec2-user 4096 Nov  5 04:21 deals
        drwxrwxr-x 2 tomcat ec2-user 4096 Nov  5 04:25 gallery-images
        drwxrwxr-x 3 tomcat ec2-user 4096 Nov  5 04:25 hotels
        drwxrwxr-x 3 tomcat ec2-user 4096 Nov  5 04:28 rooms
        drwxrwxr-x 3 tomcat ec2-user 4096 Nov  5 04:32 temp
        

        【讨论】:

        • 如果您认为这是正确的答案,请您详细说明原因。
        • 使用ls -l <file-name or dir-name>可以获得每个用户@G的权限
        猜你喜欢
        • 1970-01-01
        • 2021-12-08
        • 2023-04-07
        • 1970-01-01
        • 2011-06-30
        • 2016-04-23
        • 1970-01-01
        • 2019-05-17
        • 1970-01-01
        相关资源
        最近更新 更多