【问题标题】:What is efficient way to ensure bash script variable is valid permission bits?确保 bash 脚本变量是有效权限位的有效方法是什么?
【发布时间】:2018-12-29 03:33:50
【问题描述】:

我对@9​​87654321@ 脚本缺乏经验,主要是从谷歌搜索中拼凑出一些东西。以下简单脚本创建文件 foo 并将其权限位更改为脚本的 $1 。有经验的bash 脚本编写者能否告知什么是正确和/或有效的方法来确保$1 是有效的权限位,即有效的arg1chmod

#!/bin/sh
#mkfoo.sh

if [ $# -eq 0 ]
then
  return
fi

perm=$1

touch ./foo
chmod "${perm}" ./foo

由于我缺乏经验,我不清楚变量何时/为什么是字符串或整数。字符串验证方法感觉不可行,因为权限位可能有很多值。我想到的是我想验证 是否 $1 是一个整数,如果是,它在 0 到 777 之间。但我不清楚这是否是一个足够/有效的验证: 我对 linux 文件权限有一个初步的了解,我相信有很多微妙之处。感谢您的帮助。

【问题讨论】:

  • 为什么需要验证?如果出现错误,您打算怎么做?
  • 这并不容易,因为chmod 允许复杂的符号权限规范,例如u+r,o-w。为什么不直接检查chmod是否成功?
  • 权限位为4 2 1,用于读取、写入和执行;排序为 usergroupother,因此 198 介于 0 和 777 之间但无效,因此验证不足。我正要提到象征性表示,但 Barmar 已经提到了。
  • 如果你只想允许数字权限,你可以检查它是否匹配模式[0-7][0-7][0-7]
  • @StoneThrow,猜测一下(不是我):这个问题相当简单,并且在 bash 中验证一个整数(因为您似乎不关心 chmod 的其他权限选项)有被问了很多次,应该可以通过谷歌找到

标签: linux bash file-permissions chmod


【解决方案1】:

如果您只想允许数字权限,您可以通过模式检查来检查它们:

case "$perms" in 
    [0-7][0-7][0-7]) 
        touch ./foo
        chmod "${perm}" ./foo
        ;;
    *) 
        echo "Invalid permissions $perms"
        ;;
esac

【讨论】:

  • 有效权限实际上是 4 位数字,包括 set-uid、set-guid 和粘滞位
  • 是的,我以为他只对基本烫发感兴趣。
【解决方案2】:

根据您的 cmets,如果指定的权限无效,您的目标是放弃 chmod。

chmod "$1" ./foo 2>/dev/null

2 是标准错误的文件描述符。重定向到/dev/null 将让它静默失败。 chmod,如 cmets 中所述,会自行验证权限是否可接受。

【讨论】:

  • 当然,这仍然会留下创建的文件,只是没有您要求的权限。
  • @StephenP,是的。我以为那是目标。但是,附加 || rm ./foo 可以轻松解决该问题。
  • 如果$1 输入错误,在我的情况下,使用默认权限创建文件是可以接受的结果。
【解决方案3】:

此脚本将接受chmod 允许的任何有效权限。
它将创建文件(如果它不存在)并尝试设置权限。如果设置权限失败,文件将被删除。
它只需要两个参数;要创建的文件名和要设置的权限。

这允许您使用符号或 4 位权限,例如 create foo u+x,g+rwx(假设脚本名为“create”)或 create foo 2640

这很简单,举个例子。我经常包含一个usage() 函数,我会调用它来代替第一个echo。如果省略 seconds 参数,您还可以包含默认权限。

#!/bin/sh

if [ $# -ne 2 ]
then
    echo "output a usage message, don't just return"
    exit
fi

if [ -e "${1}" ]
then
    echo "${1} already exists"
    exit
fi

touch ./"${1}"

if chmod "${2}" "${1}" > /dev/null 2>&1
then
    echo "${1} created with permissions ${2}"
else
    rm "${1}"
    echo "${1} not created: invalid permissions: ${2}"
fi

【讨论】:

    【解决方案4】:

    正如其他人所提到的,chmod 会进行自己的验证,因此最好只使用它,但如果您绝对想以类似于您提供的代码的方式执行此操作,您可以这样做:

    #!/bin/sh
    if [ $# -eq 0 ]
    then
        echo "Invalid input"
        exit 1
    fi
    
    if ! [[ $1 =~ [0-7][0-7][0-7] ]]
    then
        echo "Invalid input"
        exit 1
    else
        perm=$1
    fi
    
    touch ./foo
    chmod "${perm}" ./foo
    

    这将确保每个数字都是有效的。

    【讨论】:

    • 这是您提出的一个有效观点,chmod 将进行自己的验证。我只是担心它可能会抛出错误消息 - 但@jeremysprofile 建议将stderr 的输出重定向到/dev/null
    猜你喜欢
    • 2011-03-02
    • 2019-03-05
    • 1970-01-01
    • 2018-12-18
    • 2013-11-11
    • 2010-09-27
    • 1970-01-01
    • 2011-08-10
    • 2019-07-12
    相关资源
    最近更新 更多