如何检查文件的组权限


9

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

而已。就那么简单。然而:

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

您需要检查组权限位,还是需要检查特定组是否具有写权限?该组(或用户)可以通过ACL拥有写权限。
吉尔(Gilles)'所以

只是组权限位。没有特定的组是相关的。
米斯拉夫

Answers:


8

方法1-统计

您可以使用该stat命令获取权限位。stat在大多数Unix(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,您需要使用这种形式的statstat -f(或stat -x),并进行相应的解析。由于选项stat不同,您可以将此命令包装在lsb_release -a命令中,然后根据操作系统调用适当的版本。不理想,但可行。要知道,lsb_release仅适用于Linux发行版那么另一种选择将需要设计用于测试其他Unix操作系统。

方法2-查找

我认为该命令可能会更好地为您服务。我利用findprintf开关。

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

方法3-Perl

Perl可能是一种更可移植的方式来执行此操作,具体取决于您要涵盖的OS。

$ 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

我认为您错过了他的观点4。该stat命令在不同系统之间差异很大,并且不便于移植。
jordanm

@jordanm-谢谢,我看到了,正在寻找替代方法。我认为find . -printf可以,但是无法确定OSX查找是否可用。
slm

1
我在POSIX2008指南中也找不到引用它,因此我倾向于同意。我不确定其他任何方法。我认为您必须在这里咬一下子弹,并检测出哪个操作系统并致电该应用程序。命令,似乎是最好的方法。
slm

1
我也没有想到使用标准Shell实用程序的方法。这就是为什么我的答案使用perl的原因。
jordanm

1
@jordanm-好主意。我也在研究perl解决方案8
slm

1

一种选择是使用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可以在stat perldoc中找到类似的示例。


1

我最终- ls解析:

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

我很感谢@slm的广泛回答,但是其他方法都不是那么简单。该stat方法将要求我编写至少两个不同的调用以覆盖OS X,即使在此之后,它也会返回八进制表示,我仍然必须对它进行算术运算。Perl方法是可以的,但是需要我启动一个解释器来完成这样一个简单的任务,并且我想保持它的简单并仅使用posix utils。


2
您正在使用bash,而不仅仅是POSIX。在POSIX中:perms=$(ls -ld -- "$1"); perms=${perms%% *}; case $perms in ?????w????) …
吉尔斯(Gills)'所以

0
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]'

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.