ファイルのグループ権限を確認する方法

ファイルのグループ権限を確認する方法

Bashスクリプトでファイルのグループ権限を確認したいと思います。特に、ファイルにグループ書き込み可能ビットがあることを確認する必要があります。

それはすべてです。とても簡単です。しかし:

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

答え1

方法 #1 - 統計

このstatコマンドを使用して許可ビットを取得できます。statほとんどのUnix(私が知っている限り、AIXではなくOSX、BSD)で使用できます。これは私が見つけることができる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]."

statOSXとBSDの場合は、この形式を使用してstat -fそれstat -xに応じて解析する必要があります。オプションがstat異なるため、このコマンドを1つにまとめてオペレーティングlsb_release -aシステムに応じて適切なバージョンを呼び出すことができます。理想的ではありませんが、可能です。lsb_releaseイムを悟ったLinuxディストリビューションにのみ適用されます。だからその他のオプション他のUnixオペレーティングシステムをテストするように設計する必要があります。

方法 #2 - 検索

私の考えでは、このコマンドはあなたにもっと役立つと思います。使用findしてprintf切り替えます。

はい

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

方法 #3 - パール

扱うオペレーティングシステムによっては、Perl がより移植性に優れた方法かもしれません。

$ perl -le '@pv=stat("afile.txt"); printf "%04o", $pv[2] & 07777;'
0664

メモ:上記はPerlstat()関数を使用してファイルシステムビットを照会します。

@pv配列を捨て、出力を直接処理してよりコンパクトにすることができますstat()

$ perl -le 'printf "%04o", (stat("a"))[2] & 07777;'
0664

答え2

私は最終的にls解析を終えました。

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

@slmの広範な答えに感謝しますが、他の方法はそれほど簡単ではありません。このstat方法を使用するには、OS Xを処理するために少なくとも2つの異なる呼び出しを作成する必要があり、その後も算術を適用する必要がある8進表現が返されます。 Perlのアプローチは問題ありませんが、これらの簡単な作業を行うにはインタプリタを実行する必要があります。

答え3

1つのオプションはを使用することですがperlperl可能な限りどこにでも移植できます。それがなければ、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例は、以下にあります。統計パールドック

答え4

FILE="filename";G=$(stat -c '%a' ${FILE} | cut -c2);
if [ $G -gt 5 ];then   echo "Group write is set on ${FILE}";fi

すべての標準 Unix/Linux ツール。

グループを書くことは可能ですが、グループを読むことは不可能だと思います。この場合、ケース説明 2|3|6|7) または grep '[2|3|6|7]' になります。

関連情報