【问题标题】:Bash. Recursive directory creation permission check重击。递归目录创建权限检查
【发布时间】:2018-08-18 12:04:53
【问题描述】:

我想在 Bash 中递归地创建一个目录,首先检查用户是否有权限。我知道mkdir -p 将创建所有子目录,但关键是我想在执行此操作之前检查用户是否能够执行此操作。

在我的程序中,用户给出了创建目录的路径。假设变量givenpath 的值为/root/newdir/anothernewone。用户 root 将能够创建它,但任何其他普通用户将无法创建它。我想检查用户是否能够做到这一点。我的非工作方法:

#!/bin/bash

givenpath="/root/newdir/" # This works
#givenpath="/root/newdir/anothernewone/" # This is not working

if [ -d $(dirname "${givenpath}") ]; then
    if [ ! -w $(dirname "${givenpath}") ]; then
        echo "Error, You don't have write permissions"
    else
        echo "Yeah, there are permissions"
    fi
else
    echo "Error, base dir to create subdirs is not existing"
fi

这并不完全有效。使用 givenpath /root/newdir 它将起作用,因为 basedir 是 /root/ 并且已为两个用户正确检查,但如果给出更多子目录,如 /root/newdir/anothernewone 它将失败,因为 basedir 是 /root/newdir/ 所以 basedir 尚不存在并且对两个用户都将失败。

如果可能的话,关键是能够首先检查创建目录。也许一个解决方案可以从给定的第一级开始对每个目录进行递归检查,直到到达一个不存在的目录,检查最后一个现有的目录是否有写权限......

我正在考虑的另一种非常非常肮脏的方法可能是启动mkdir -p 命令并检查退出代码。如果它不同于 0,则一切都清楚,没有权限......如果它是 0 好的,则有权限,但我应该删除创建的目录,因为我想要检查而不创建目录。

但我不知道该怎么做。有什么帮助吗?谢谢。

【问题讨论】:

  • 如果你对目录/root有写权限,什么时候不能创建所有子目录?
  • 好点...但是,如果给定路径是 /newdir/anothernewone ,如何区分要检查的基本目录?我怎么知道我必须检查 / 而不是 /newdir ??
  • 我在这里没有发现问题。如果您尝试mkdir -p /some/long/path/to/my/dir,那么您将成功创建任何中间目录,或者您尝试创建的第一个不存在的目录将失败,留下未修改的文件系统。例如,您永远无法做到以/some/long 开始,然后成功创建/some/long/path,然后无法创建/some/long/path/to(至少,由于权限)。
  • 是的,但我需要知道 mkdir 能够写入,而不是写入。谢谢。

标签: bash mkdir dirname


【解决方案1】:

如何通过实际尝试创建测试文件夹进行检查的过度示例:

function check_dir_permissions() {
    givenpath="${1}"
    if [ ! -d $(dirname "${givenpath}") ]; then
        echo "failed: directory doesn't exist"
        return 0
    fi

    tmp_dir="test_dir_check_folder-${RANDOM}"
    curr_pwd=$(pwd)

    cd "${givenpath}"
    mkdir  "${givenpath}/${tmp_dir}"  2>/dev/null
    test=$?
    [[ -d "${givenpath}/${tmp_dir}" ]] && rmdir "${givenpath}/${tmp_dir}"
    cd "$curr_pwd"

    if [ $test -ne 0 ]; then
        echo "Failed: on Permissions"
        return 1 
    else
        echo "Success: You have permissions"
        return 0
    fi
}

示例:

$ ./check_dir.sh /root
failed
You DO NOT have the permissions to write to [/root] 

$ ./check_dir.sh /tmp
good
You have the permissions to write to [/tmp] 

您可以将函数包装在一个循环中,该循环遍历每个文件夹并检查并在发现问题时停止,我不得不承认这是一种奇怪的方法,但您可能有一个特定的用例。

【讨论】:

    【解决方案2】:

    我做了一个递归函数......仍在测试中,但也许它可能是一个解决方案。请,如果有人可以贡献改进它,欢迎:

    #!/bin/bash
    
    #givenpath="/root/" #root can write, user not
    givenpath="/root/newdir/anothernewone/" #root can write, user not
    #givenpath="/home/user/newdir" #both user and root can write
    
    function dir_permission_check() {
    
        if [ -w "${1}" ]; then
            return 0
        else
            basedir=$(dirname "${1}")
            if [ "${basedir}" != "/" ]; then
                if dir_permission_check "${basedir}"; then
                    return 0
                else
                    return 1
                fi
            elif [ -w "${basedir}" ]; then
                return 0
            else
                return 1
            fi
       fi
    }
    
    dir_permission_check "${givenpath}"
    echo $?
    

    如果返回退出码0,表示有写权限,否则用户无权限。我对这个功能有什么看法吗?也许这不是太优雅的解决方案,但它似乎正在工作。

    编辑

    该功能似乎工作正常。这是一种改进且更干净的方法:

    #!/bin/bash
    
    #givenpath="/root/" #root can write, user not
    givenpath="/root/newdir/anothernewone/" #root can write, user not
    #givenpath="/home/user/newdir" #both user and root can write
    
    function dir_permission_check() {
    
        if [ -e "${1}" ]; then
            if [ -d "${1}" ] && [ -w "${1}" ] && [ -x "${1}" ]; then
                return 0
            else
                return 1
            fi
        else
            dir_permission_check "$(dirname "${1}")"
            return $?
        fi
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 2012-06-12
      • 2012-09-07
      相关资源
      最近更新 更多