Bashスクリプトでファイルのグループ権限を確認したいと思います。特に、ファイルにグループ書き込み可能ビットがあることを確認する必要があります。
それはすべてです。とても簡単です。しかし:
- 持ち運びにも必要でした。
test -w <file
グループ書き込み可能かどうかはわかりません。- 出力は
ls -ld
人には問題ないようですが、スクリプトについては確信はありません。技術的には、drwxrwxr-x
グループビットの抽出などの出力を解析できますが、これは脆弱に見えます。 - OS Xと他のシステム間のインタフェースは
stat
完全に互換性がありません。 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]."
stat
OSXと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つのオプションはを使用することですが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
例は、以下にあります。統計パールドック。
答え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]' になります。