代码之家  ›  专栏  ›  技术社区  ›  MattBianco

寻找一种更有效(和可移植)的方法来获得unix中的(数字)文件权限

  •  3
  • MattBianco  · 技术社区  · 15 年前

    简短背景:我需要用ZABBIX监视unix文件(目录)上的权限,看看它们是否/何时更改。ZABBIX没有任何类似于vfs.file.mode[xxxx]的内置参数,所以我不得不使用数字类型滚动自己的UserParameter。

    到目前为止,我所做的是 ls -l | cut -c 2-10 为了得到 rwxr-xr-x sed 将字母转换为“重量”,以及 awk 具有 substr 总结一下,得到 755 或者任何有价值的东西。

    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工具。

    一周前我“偶然”发现了这个地方,我真的很喜欢它!在一个地方看到这么多的知识、技能和友好真是太棒了!

    6 回复  |  直到 15 年前
        1
  •  1
  •   Steve Weet    15 年前

    我不认为这比你自己的版本更优雅/高效,但我会把它放在这里,以防任何技术对你自己的改进有用。不过,这显然可以用一个脚本更简单/优雅地完成

    基本前提是使用tr将rwx转换为相关的八进制数,然后使用sed将rwx拆分为3个add plus的组,然后生成awk命令字符串whicg传递给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 -`
    
        2
  •  4
  •   Aleksey Otrubennikov    15 年前

    find 这样看起来更好:

    find FILENAME -prune -printf '%m\n'

    找到了 here

        3
  •  1
  •   morriset    10 年前

    如果你的系统 bash ls -l 显示文件权限(rwxrwx),您可以通过以下示例完成所需的操作:

    #!/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等其他实用程序。

        4
  •  0
  •   bedwyr    15 年前

    stat 应该有你想要的。请尝试下列操作之一:

    stat -c "%a" <filename>
    

    stat --printf="%a" <filename>
    
        5
  •  0
  •   Dennis Williamson    15 年前

    这是冗长的,但我认为它比你的更容易维护。你可以这样称呼它: ls -ld / | cut -c 2-10 | ./perm.awk

    #!/usr/bin/gawk -f
    # OR: #!/usr/bin/nawk -f
    
    function conv(num, len, i, val) {
        # converts binary string to decimal (or octal if fed 3 "bits" at a time)
        # call with num as argument, others are local variables
        len = length(num)
        for(i = len; i > 0; i--) {
            if (substr(num, i, 1) == 1) {
                val = val + 2 ^ (len - i)
            }
        }
        return val
    }
    
    # main loop
    {
        # TODO: handle [sStT]
        gsub("[rwx]", 1)    # make it look binary
        gsub("-", 0)
        for(i = 0; i < 3; i++) {
            perm = perm conv(substr($0, i * 3 + 1, 3))    # convert the "bits" 3 at a time
        }
    }
    
    END {
        print perm
    }
    
        6
  •  0
  •   Norman Ramsey    15 年前

    的实现 ls 长征 也不是很便携。

    我会用 Lua Lua POSIX library ,在任何POSIX平台上都应该是现成的。在那里你可以做你的 stat Programming in Lua 在线免费提供(对于Lua的早期版本)。最后,如果你关心效率,结果会是 极其

    推荐文章