我希望在Bash中以递归方式创建一个dir,首先检查用户是否具有权限。我知道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是{{ 1}},因此basedir尚不存在,并且对两个用户都将失败。
关键是要能够创建Dirs首先进行检查。也许一种解决方案是从给定的第一级开始对每个目录进行递归检查,直到不存在的目录检查是否对最后一个现有目录具有写权限...
我正在考虑的另一种非常肮脏的方法可能是启动/root/newdir/
命令并检查退出代码。如果它不同于0,则所有内容清除,没有权限...,如果它为0,表示有权限,但是我应该删除创建的目录,因为我要检查的是不创建目录的地方。
但是我不知道该怎么做。有什么帮助吗?谢谢。
答案 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 "${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
}
答案 1 :(得分:0)
关于如何通过实际尝试创建测试文件夹进行检查的超大示例:
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]
您可以将函数包装在循环中,该循环遍历每个文件夹并检查并停止,如果发现问题,我必须承认这是一种怪异的方法,但是您可能有一个特定的用例。