如何检查文件的组权限

如何检查文件的组权限

我想从 bash 脚本检查文件的组权限。具体来说,我需要检查文件是否具有组可写位。

就是这样。就那么简单。然而:

  1. 我还需要它是便携式的。
  2. test -w <file不会告诉我它是否是可组写入的。
  3. 的输出ls -ld对人类来说很好,但对脚本不太确定。从技术上讲,我可以解析输出,例如drwxrwxr-x提取组位,但这似乎很脆弱。
  4. OS X 和其他系统之间的接口stat完全不兼容。
  5. find <file> -perm ...不可能是答案吗?

答案1

方法#1 - 统计

您可以使用该stat命令来获取权限位。stat在大多数 Unixes 上都可用(OSX、BSD,据我所知,AIX 上不可用)。这应该适用于大多数 Unix,除了我能找到的 OSX 和 BSD。

$ stat -c "%a" <file>

例子

$ ls -l a
-rw-rw-r-- 1 saml saml 155 Oct  6 14:16 afile.txt

使用这个命令:

$ stat -c "%a" afile.txt
664

并使用简单的方法grep查看组的权限模式是6还是7。

$ stat -c "%a" afile.txt | grep ".[67]."

对于 OSX 和 BSD,您需要使用这种形式的stat, stat -f(或者可能stat -x),并进行相应的解析。由于选项stat不同,您可以将此命令包装在一个lsb_release -a命令中,并根据操作系统调用适当的版本。不理想但可行。意识到那lsb_release仅适用于 Linux 发行版所以另一种选择需要设计用于测试其他 Unix 操作系统。

方法#2 - 查找

我认为这个命令可能会更好地为你服务。我使用findprintf开关。

例子

$ find a -prune -printf '%m\n'
664

方法 #3 - Perl

Perl 可能是一种更便携的方法,具体取决于您要覆盖的操作系统。

$ perl -le '@pv=stat("afile.txt"); printf "%04o", $pv[2] & 07777;'
0664

笔记:上面使用 Perl 的stat()函数来查询文件系统位。

您可以通过放弃使用数组@pv并直接处理 的输出来使其更加紧凑stat()

$ perl -le 'printf "%04o", (stat("a"))[2] & 07777;'
0664

答案2

我最终ls解析:

is_group_writable() {
  local ls="$(ls -ld "$1")"
  [ "${ls:5:1}" = "w" ]
}

我很感谢@slm 的广泛回答,但其他方法都没有那么简单。该stat方法需要我编写至少两个不同的调用来覆盖 OS X,即使之后它返回我仍然需要对其应用算术的八进制表示形式。 Perl 方法还可以,但需要我为这样一个简单的任务启动一个解释器,我想保持简单并仅使用 posix utils。

答案3

一种选择是使用perl,它可以在任何perl可用的地方移植。很难找到一个没有它的unix 系统。以下是如何将其集成到 shell 脚本中的示例:

if perl -e 'use Fcntl ":mode"; exit( ((stat("file.txt"))[2] & S_IWGRP) >> 3)'; then
    echo "file is group writable"
else
    echo "file is not group witeable"
fi

类似的perl例子可以在统计perldoc

答案4

FILE="filename";G=$(stat -c '%a' ${FILE} | cut -c2);
if [ $G -gt 5 ];then   echo "Group write is set on ${FILE}";fi

所有标准 Unix/Linux 工具。

我想可以进行组写,但不能进行组读。在这种情况下,它将是 case 语句 2|3|6|7) 或 grep '[2|3|6|7]'

相关内容