如何检测文件系统是否支持权限?

How to detect if a filesystem supports permissions?

提问人:Maestro 提问时间:11/12/2023 最后编辑:Maestro 更新时间:11/18/2023 访问量:160

问:

最近,当我的脚本通过 tar 将临时文件提取到用户选择的文件夹时,我遇到了一个问题。

问题在于,如果该文件夹位于带有文件系统的 U 盘上,则提取的文件会丢失文件系统与每个文件一起存储的权限信息。exfatext4btrfs

为了解决这个问题,我创建了以下修复程序:

#!/usr/bin/env bash

FOLDER="/example"
FS=$(stat -f -c %T "$FOLDER")

if [[ "$FS" == "fat"* || "$FS" == "vfat"* || "$FS" == "exfat"* || "$FS" == "ntfs"* || "$FS" == "fuse"* || "$FS" == "msdos"* ]]; then
  echo "Unsupported filesystem!"
  exit
fi

虽然这可行,但它要求我保留一个列表,列出哪些文件系统与权限不兼容,而且我确信我的列表远未完成。因为存在数十个可能存在相同问题的外来文件系统。ext4

那么,有没有更好的方法来测试文件夹是否支持权限,而不必先写文件呢?如果没有,我应该将哪些文件系统添加到此列表中以使其更完整?

Linux Bash 系统文件 权限 ext4

评论


答:

2赞 Léa Gris 11/13/2023 #1

检查是否可以更改写入权限并使其成为函数可能是可以的:

#!/usr/bin/env sh

# Checks path support changing write permissions
# @args
#     $1: The path to check (mandatory)
# @return
#     0: Allow changing write permission
#     1: Does not allow changing write permission
#     2: Cannot perform the check
canChangeWritePermission() {
    [ -d "${1:?}" ] || return 2
    __cCWP_tmpFile=$(TMPDIR=$1 mktemp) || return 2

    if
        chmod -w "$__cCWP_tmpFile" && ! [ -w "$__cCWP_tmpFile" ] &&
        chmod +w "$__cCWP_tmpFile" && [ -w "$__cCWP_tmpFile" ]
        then rc=0
        else rc=1
    fi
    rm -f -- "$__cCWP_tmpFile"
    return $rc
}

if canChangeWritePermission "${1:?}" 2>/dev/null
then printf '%s has support for changing write permission.\n' "$1"
elif [ $? -eq 1 ]
    then printf '%s does not allow changing write permission.\n' "$1"
    else printf 'Cannot check %s\n' "$1" >&2
fi

评论

0赞 user1934428 11/13/2023
我认为你没有必要。只是做一个就足够了。但是,如果无法更改权限,则依赖于设置此退出代码。IMO,更可靠的做法是取消写入权限,然后将某些内容写入文件,然后重新读取文件以查看数据是否已写入。ifchmod ... && chmod ...; rc=$?chmod
1赞 Léa Gris 11/13/2023
@user1934428显式条件使代码逻辑比存储更清晰,因为 -w' 标志状态实际上反映了已设置的内容已经足够好了(我想不出一个有效的场景,在不实际禁止写入操作的情况下关闭写入标志)。ifrc=$?rm -f -- "$tmpFile" is mandatory even when the check fails. Testing if the chmod
0赞 saidtechnology 11/18/2023 #2
tempfile=$(mktemp)
chmod 600 "$tempfile" 2>/dev/null
if [ $? -eq 0 ]; then
    echo "Filesystem supports permissions"
else
    echo "Filesystem does not support permissions"
fi
rm "$tempfile"

评论

0赞 possum 11/22/2023
这可以通过对代码的作用进行一些注释来改进。