ファイルのグループ権限を検査する方法


9

bashスクリプトからファイルのグループ権限を検査したいと思います。具体的には、ファイルにグループ書き込み可能ビットがオンになっているかどうかを確認する必要があります。

それでおしまい。そのような単純な。しかしながら:

  1. 持ち運びにも便利です。
  2. test -w <file グループ書き込み可能かどうかはわかりません。
  3. の出力はls -ld人間にとっては良いですが、スクリプトについてはよくわかりません。技術的にはdrwxrwxr-x、グループビットを抽出するなど、出力を解析できましたが、これは脆弱に思われます。
  4. のインターフェイスstatは、OS Xと他のシステムとの間で完全に互換性がありません。
  5. find <file> -perm ... おそらく答えにはなりませんか?

グループ許可ビットを確認する必要がありますか、または特定のグループに書き込み許可があるかどうかを確認する必要がありますか?グループ(またはユーザー)は、ACLを通じて書き込み権限を持つことができます。
Gilles 'SO-悪をやめる'

ただグループ許可ビット。特定のグループは関係ありません。
mislav 2013年

回答:


8

方法#1-統計

statコマンドを使用して、許可ビットを取得できます。statほとんどのUnixで利用できます(OSX、BSD、AIXではありません)。これは、OSXとBSDを除いて、ほとんどのUnixで動作するはずです。

$ 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して、OSに基づいて適切なバージョンを呼び出すことができます。理想的ではありませんが実行可能です。これlsb_releaseLinuxディストリビューションでのみ利用可能であることを理解してください。そのため、他のUnix OSをテストするには、別の方法を考案する必要があります。

方法#2-検索

このコマンドはあなたのために役立つかもしれませんが。私が使用可能findprintfスイッチを。

$ find a -prune -printf '%m\n'
664

方法#3-Perl

カバーしようとしているOSによっては、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

彼のポイントを逃したと思います。4。statコマンドはシステムによって大きく異なり、移植性はありません。
ヨルダン2013年

@jordanm-私が見たおかげで、代替案を探していました。私find . -printfはそれを行うことができると思いますが、それがOSXのfindで利用可能かどうかを判断できません。
slm

1
POSIX2008ガイドでも参照されていなかったので、同意する傾向があります。他の方法はわかりません。ここで弾丸を噛んで、どのOSを検出してappropを呼び出す必要があると思います。コマンドは、最善のアプローチであると思われます。
slm

1
標準のシェルユーティリティを使用する方法も思いつきませんでした。それが私の答えがperlを使用する理由です。
ヨルダン2013年

1
@jordanm-素晴らしい心。私もperlソリューションに取り組んでいました8
slm

1

1つのオプションは、を使用perlすることperlです。それなしでUNIXシステムを見つけるのは難しいです。これをシェルスクリプトに統合する方法の例を次に示します。

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にあります。


1

私は最終的にls解析しました:

is_group_writable() {
  local ls="$(ls -ld "$1")"
  [ "${ls:5:1}" = "w" ]
}

@slmの幅広い回答に感謝しますが、他の方法はどれも簡単ではありません。このstatメソッドでは、OS Xをカバーするために少なくとも2つの異なる呼び出しを記述する必要があり、その後も、計算を適用する必要がある8進数表現を返します。Perlの方法は問題ありませんが、このような単純なタスクのインタープリターを開始する必要があります。私はそれを単純に保ち、posix utilsのみを使用したいと考えています。


2
POSIXだけでなく、bashを使用しています。POSIXの場合:perms=$(ls -ld -- "$1"); perms=${perms%% *}; case $perms in ?????w????) …
Gilles「SO-悪をやめる」

0
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]'のいずれかになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.