简短背景:我需要使用ZABBIX监视unix文件(目录)上的权限,以查看它们是否/何时发生更改。ZABBIX没有类似vfs.file.modexxxx这样的内置函数,所以我不得不使用自己的数值类型的UserParameter。
到目前为止,我所做的是使用ls -l | cut -c 2-10获取rwxr-xr-x部分,然后使用sed将字母转换为它们的“权重”,并使用awk和substr对其求和,以获得数字755或其他值。
这是目前在Solaris上,我没有GNU stat命令,我希望它是可移植的和有效的,并且只使用标准的unix工具,总是可用的。(IMHO,perl并不总是可用的)。
我的第一次尝试(根目录的示例):
ls -ld / | \
cut -c 2-10 | \
sed -e 's%-%0%g' -e 's%r%4%g' -e 's%w%2%g' -e 's%x%1%g' | \
awk '{print (100 * ((substr($0,1,1)) + (substr($0,2,1)) + (substr($0,3,1))) + \
(10 * ((substr($0,4,1) + (substr($0,5,1)) + (substr($0,6,1)) ))) + \
( (substr($0,7,1)) + (substr($0,8,1)) + (substr($0,9,1)) ) );}'正如您所看到的,我不关心setuid位或文件以外的任何东西,但纯粹的响应总是受欢迎的!
当然,肯定有更优雅的解决方案。也许是一个我没有想到的标准unix工具。
我大约一周前“偶然”发现了这个地方,我真的真的很喜欢它!在一个地方看到如此多的知识、技能和友好性,真是令人惊叹!这是我的第一个问题,所以我真的很兴奋能不能得到任何回应!:-)非常感谢!
发布于 2010-07-08 06:50:57
我不认为这比你自己的版本更优雅/更高效,但我会把它放在上面,以防有任何技术对改进你自己的有用。显然,使用脚本可以更简单、更优雅地实现这一点
基本前提是使用tr将rwx转换为相关的八进制数,然后使用sed将其拆分为3个相加脉冲的组,然后生成awk命令字符串,将该字符串传递给awk以将它们相加。
ls -ld / | \
cut -c2-10 | \
tr 'rwx-t' '42100' | \
sed -E -e 's/(...)(...)(...)/\1 \2 \3/g' \
-e 's/([0-9])([0-9])([0-9])/\1+\2+\3/g' \
-e 's/^(.*)$/BEGIN {print \1}/g'|\
awk -f -`发布于 2010-07-08 01:42:32
如果你可以使用find,这看起来会更好:
find FILENAME -prune -printf '%m\n'
找到了here
发布于 2015-01-12 10:11:48
如果您的系统具有bash,并且ls -l显示了文件权限(rwxrwxrwx),则可以通过以下示例实现您想要的结果:
#!/bin/sh
[ ! -d $1 ] && echo "Error: "$1" is not a directory" && exit 1
set -- `ls -ld $1`;P=${1:1:9};P=${P//r/4 };P=${P//w/2 };P=${P//x/1 };P=${P//-/0 }
set -- $P; echo $((($1+$2)+$3))$((($4+$5)+$6))$((($7+$8)+$9))优点是不需要其他实用程序,如awk或sed。
https://stackoverflow.com/questions/3195737
复制相似问题