我想从 bash 脚本检查文件的组权限。具体来说,我需要检查文件是否具有组可写位。
就是这样。就那么简单。然而:
- 我还需要它是便携式的。
test -w <file
不会告诉我它是否是可组写入的。- 的输出
ls -ld
对人类来说很好,但对脚本不太确定。从技术上讲,我可以解析输出,例如drwxrwxr-x
提取组位,但这似乎很脆弱。 - OS X 和其他系统之间的接口
stat
完全不兼容。 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 - 查找
我认为这个命令可能会更好地为你服务。我使用find
和printf
开关。
例子
$ 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]'