我想从bash脚本检查文件的组权限。具体来说,我需要检查文件是否具有组可写位。
而已。就那么简单。然而:
- 我还需要此便携式产品。
test -w <file
不会告诉我它是否可以组写。- 的输出
ls -ld
对人类来说很不错,但是对脚本却不太确定。从技术上讲,我可以解析输出drwxrwxr-x
以提取组位,但这似乎很脆弱。 stat
OS X和其他系统之间的接口完全不兼容。find <file> -perm ...
不可能是答案吗?
我想从bash脚本检查文件的组权限。具体来说,我需要检查文件是否具有组可写位。
而已。就那么简单。然而:
test -w <file
不会告诉我它是否可以组写。ls -ld
对人类来说很不错,但是对脚本却不太确定。从技术上讲,我可以解析输出drwxrwxr-x
以提取组位,但这似乎很脆弱。stat
OS X和其他系统之间的接口完全不兼容。find <file> -perm ...
不可能是答案吗?Answers:
您可以使用该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,您需要使用这种形式的stat
,stat -f
(或stat -x
),并进行相应的解析。由于选项stat
不同,您可以将此命令包装在lsb_release -a
命令中,然后根据操作系统调用适当的版本。不理想,但可行。要知道,lsb_release
是仅适用于Linux发行版那么另一种选择将需要设计用于测试其他Unix操作系统。
我认为该命令可能会更好地为您服务。我利用find
和printf
开关。
$ find a -prune -printf '%m\n'
664
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
stat
命令在不同系统之间差异很大,并且不便于移植。
find . -printf
可以,但是无法确定OSX查找是否可用。
一种选择是使用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中找到类似的示例。
我最终- ls
解析:
is_group_writable() {
local ls="$(ls -ld "$1")"
[ "${ls:5:1}" = "w" ]
}
我很感谢@slm的广泛回答,但是其他方法都不是那么简单。该stat
方法将要求我编写至少两个不同的调用以覆盖OS X,即使在此之后,它也会返回八进制表示,我仍然必须对它进行算术运算。Perl方法是可以的,但是需要我启动一个解释器来完成这样一个简单的任务,并且我想保持它的简单并仅使用posix utils。
perms=$(ls -ld -- "$1"); perms=${perms%% *}; case $perms in ?????w????) …