加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何确保两个目录不是彼此的子目录(BASH)

发布时间:2020-12-15 20:55:29 所属栏目:安全 来源:网络整理
导读:编辑:这或多或少是我在@Mutor的好输入后出现的.任何见解? #!/bin/bashpath1="$(readlink -e "$1")"path2="$(readlink -e "$2")"EBADARGS=65function checkArgsNumber(){ if test "$#" -ne 2; then echo "ERRORE: this script takes exactly 2 params." exi
编辑:这或多或少是我在@Mutor的好输入后出现的.任何见解?

#!/bin/bash

path1="$(readlink -e "$1")"
path2="$(readlink -e "$2")"

EBADARGS=65

function checkArgsNumber()
{
    if test "$#" -ne 2; then
        echo "ERRORE: this script takes exactly 2 params."  
        exit $EBADARGS
    fi
}

function checkExistence()
{
    if [ ! -d $path1 ]; then
        echo  "ERROR: "$1" does not exist"
        exit $EBADARGS
    elif [ ! -d "$2" ]; then
        echo  "ERROR: "$2" does not exist"
        exit $EBADARGS
    elif [[ -L $path1 ]]; then
        echo "ERROR: path1 can't be a symbolic link"
        exit $EBADARGS
    elif [[ -L $2 ]]; then
        echo "ERROR: path2 can't be a symbolic  link"
        exit $EBADARGS
    fi
}

function checkIfSame()
{
    if [[ $path1 == $path2 ]]; then
        echo "ERROR: path1 and path2 must be different directories"
        exit $EBADARGS     
    fi   
}

function checkIfSubdirectories()
{
    if [[ $path1 = *$path2* ]]; then
        echo "ERROR:"$1" is a $path2 subdirectory"
        exit $EBADARGS
    elif [[ $path2 = *$path1* ]]; then
        echo "ERROR:"$2" is a  $path1 subdirectory"
        exit $EBADARGS
    elif [[ -e "$(find $path1 -samefile $path2)" ]]; then
        echo "ERROR:"$(find $path1 -samefile $path2 -print0)" and "$2" have the same inode,$path2 is a  $path1 subdirectory"
        exit $EBADARGS
    elif [[ -e "$(find $path2 -samefile $path1)" ]]; then
        echo "ERROR:"$(find $path2 -samefile $path1 -print0)" and "$2" have the same inode,$path1 is a  $path2 subdirectory"
        exit $EBADARGS
    fi
}

checkArgsNumber "$@"
checkExistence "$@"
checkIfSame "$@"
checkIfSubdirectories "$@"

现在..这应该工作,我希望它以某种方式有用.
有人可以解释一下* $path2 *部分是如何工作的吗?这个* *运算符的名称是什么?我应该去哪里阅读它?

解决方法

一些问题:

文体

您应该引用整个参数来回显,如

echo "ERROR: $1 is a subdirectory of $(readlink -e "$2")"

如果没有回显参数的引号,你在技术上将每个单词作为自己的参数传递:echo“ERROR:somedir”“is”“a”“subirectory”….由于echo按给定的顺序打印其参数,分开按空格,输出在您的情况下是相同的.但从语义上讲,这不是你想要的.

(一个不同的例子:

echo foo          bar

会打印foo吧.)

错误消息无法正常工作

如果参数不存在

$./check.sh nonexistent1 nonexistent2
ERROR:nonexistent1 is a subdirectory of

显然,如果您已经检查过它们,那就无关紧要了.

您同样需要检查角落情况,例如参数引用同一目录的位置:

$mkdir a b
$ln -s ../a b/c
$./check.sh a b/c
ERROR:a is a subdirectory of /dev/shm/a

不检测符号链接

$mkdir a b
$ln -s ../a b/c
$./check.sh a b

没有给出错误信息.

不检测mount –bind

$mkdir a b b/c
$sudo mount --bind a b/c
$./check.sh a b

没有给出错误信息.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读