Bash。递归目录创建权限检查

Bash. Recursive directory creation permission check

我想在 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,则有权限,但我应该删除创建的目录,因为我想要的是在不创建目录的情况下进行检查。

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

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

#!/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 "" ]; then
        return 0
    else
        basedir=$(dirname "")
        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 "" ]; then
        if [ -d "" ] && [ -w "" ] && [ -x "" ]; then
            return 0
        else
            return 1
        fi
    else
        dir_permission_check "$(dirname "")"
        return $?
    fi
}

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

function check_dir_permissions() {
    givenpath=""
    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] 

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