3

短い背景:ZABBIXを使用してUNIXファイル(ディレクトリ)のアクセス許可を監視して、アクセス許可が変更されるかどうか/いつ変更されるかを確認する必要があります。ZABBIXにはこのためのvfs.file.mode[xxxx]のような組み込みがないため、数値タイプで独自のUserParameterをロールする必要がありました。

私がこれまでに行ったことは、パーツls -l | cut -c 2-10を取得するために使用し、次に文字を「重み」に変換するために使用し、それを合計して数値などの値を取得するために使用します。rwxr-xr-xsedawksubstr755

これは現在Solaris上にあり、GNU coreutilsstatコマンドはありません。移植性と効率性が高く、常に利用可能な標準のUNIXツールのみを使用する必要があります。(私見、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ツールです。

私はこの場所を「偶然に」約1週間前に見つけました、そして私は本当にそれが大好きです!たくさんの知識、スキル、そして親しみやすさを1か所で見るのは素晴らしいことです。これが私の最初の質問なので、何か返事が来るかどうか本当に楽しみです!:-) どうもありがとう!

4

6 に答える 6

4

あなたが使うことができるならfind、これはより良く見えます:

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

ここで見つけました

于 2010-07-07T17:42:32.323 に答える
1

これがあなた自身のバージョンよりもエレガント/効率的であるとは思いませんが、テクニックのいずれかがあなた自身のバージョンを改善するのに役立つ場合に備えて掲載します. これは明らかに、スクリプトを使用してはるかに簡単/エレガントに行うことができます

基本的な前提は、tr を使用して rwx を関連する 8 進数に変換し、次に sed を使用して 3 つの add pluses のグループに分割し、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-07T22:50:56.537 に答える
0

これは長蛇の列ですが、あなたよりも保守しやすいと思います。あなたはそれをこのように呼ぶことができます: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
}
于 2010-07-08T01:09:03.807 に答える
0

statあなたが探しているものがあるはずです。次のいずれかを試してください。

stat -c "%a" <filename>

また

stat --printf="%a" <filename>
于 2010-07-07T14:38:01.577 に答える
0

の実装はlsさまざまであるため、実際にlsは移植性もありません。

この問題は、任意の ANSI 標準 C プラットフォームでコンパイルされる Lua と、任意の POSIX プラットフォームですぐにビルドできるLua POSIX ライブラリを使用して解決します。そこで、stat直接呼び出しを行い、明確で単純なコードを記述して算術演算を行うことができます。Lua での Luaプログラミングの優れた入門書は、オンラインで無料で入手できます (以前のバージョンの Lua 用)。最後に、効率を重視する場合、結果は非常に効率的になります。これは、Lua が高速であることも理由の 1 つですが、ほとんどの場合、1 つのプロセス (Lua インタープリター) のみを fork するだけですべてを実行できるためです。

于 2010-07-08T01:32:47.070 に答える