Bash 猛击。递归目录创建权限检查
我想在Bash中递归地创建一个dir,首先检查用户是否有权限。我知道Bash 猛击。递归目录创建权限检查,bash,mkdir,dirname,Bash,Mkdir,Dirname,我想在Bash中递归地创建一个dir,首先检查用户是否有权限。我知道mkdir-p将创建所有子曲面,但问题是,我想在执行之前检查用户是否能够执行该操作 在我的程序中,用户给出了创建目录的路径。让我们假设vargivenpath的值为/root/newdir/anothernewone。root用户将能够创建它,但任何其他普通用户都无法创建它。我想检查用户是否能够做到这一点。我的非工作方法: #!/bin/bash givenpath="/root/newdir/" # This works #
mkdir-p
将创建所有子曲面,但问题是,我想在执行之前检查用户是否能够执行该操作
在我的程序中,用户给出了创建目录的路径。让我们假设vargivenpath
的值为/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还不存在,并且对于两个用户都将失败
关键是如果可能的话,首先能够创建dirs检查。也许一个解决方案是从给定的第一级开始对每个目录进行递归检查,直到达到一个不存在的目录检查,如果最后一个存在的目录上有写权限
我正在考虑的另一种非常肮脏的方法可能是启动mkdir-p
命令并检查退出代码。如果与0不同,则所有内容都已清除,没有权限。。。如果是0 ok,则有权限,但我应该删除已创建的目录,因为我希望在不创建目录的情况下进行检查
但我不知道怎么做。有什么帮助吗?谢谢。我做了一个递归函数。。。仍在测试中,但这可能是一个解决方案。请注意,如果有人能对其进行改进,欢迎:
#!/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
}
如何通过实际尝试创建测试文件夹进行检查的过度紧张示例:
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]
你可以将函数包装成一个循环,循环遍历每个文件夹,检查并停止它,如果它发现问题,我不得不承认这是一种奇怪的方法,但是你可能有一个特定的用例 如果你有目录/根目录的写权限,什么时候不可能创建所有的子目录?很好。。。但是,如果给定路径是
/newdir/另一个newone
,如何区分要检查的基本目录?我怎么知道我必须检查/而不是/newdir?我看这里没有问题。如果您尝试mkdir-p/some/long/path/to/my/dir
,则您将成功创建任何中间目录,或者尝试创建的第一个不存在的目录将失败,留下未修改的文件系统。例如,您永远无法从/some/long
开始,然后成功创建/some/long/path
,然后无法创建/some/long/path/to
(至少,由于权限的原因)。是的,但我需要知道mkdir能够写入,而不是写入。谢谢