如何检查文件的组权限

mis*_*lav 13 ls bash permissions stat

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

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

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

slm*_*slm 9

方法#1 - 统计

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

$ stat -c "%a" <file>
Run Code Online (Sandbox Code Playgroud)

例子

$ ls -l a
-rw-rw-r-- 1 saml saml 155 Oct  6 14:16 afile.txt
Run Code Online (Sandbox Code Playgroud)

使用这个命令:

$ stat -c "%a" afile.txt
664
Run Code Online (Sandbox Code Playgroud)

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

$ stat -c "%a" afile.txt | grep ".[67]."
Run Code Online (Sandbox Code Playgroud)

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

方法#2 - 查找

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

例子

$ find a -prune -printf '%m\n'
664
Run Code Online (Sandbox Code Playgroud)

方法 #3 - Perl

Perl 可能是一种更便携的方式来执行此操作,具体取决于您尝试涵盖的操作系统。

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

注意:以上使用 Perl 的stat()函数来查询文件系统位。

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

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


mis*_*lav 2

我最终解析ls

is_group_writable() {
  local ls="$(ls -ld "$1")"
  [ "${ls:5:1}" = "w" ]
}
Run Code Online (Sandbox Code Playgroud)

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

  • 您使用的是 bash,而不仅仅是 POSIX。在 POSIX 中: `perms=$(ls -ld -- "$1"); 权限=${权限%% *}; case $perms in ??????w??????) ...` (3认同)