2013-10-24 5 views
5

与えられたユーザが内部のすべてのファイルとサブディレクトリを持つ特定のディレクトリを読み取ることができる場合は、bashスクリプトでテストする必要があります。スクリプトはのルートとして実行されます。指定されたユーザー名と仮定すると指定されたユーザーがディレクトリと内部のすべてのファイルを読み取ることができるかどうかをテストするBashスクリプト?

$userで、テストへのディレクトリが$dirである私は、スクリプトに

 
su -m $user -c "test -r $dir && test -x $dir" 
if [ $? -ne ]; then 
    echo "$dir is not readable or executable" 
fi 

を次の行を追加して、あなたは正しい提案するか、それを改善するだろうか?

答えて

4

あなたは、単に言うことができる:$dir内の任意のファイル/ディレクトリが読み取り不能である場合に

su -m $user -c "find $dir >/dev/null 2>&1 || echo $dir is not readable or executable" 

これは読めるまたは実行可能ではないメッセージが生成されます。

find $dirは、ファイルを読み取ることができない場合にエラーコード0以外を返します。


EDIT:すべてのディレクトリを見つけるのより完全な(または信頼できる)方法/読み出し可能でないファイルが言って次のようになります。

find . \(-type d -perm /u+r -o -type d -perm /u+x -o -type f -perm /u+r \) 
+0

これは、いくつかのファイルが読めない場合であっても0を返す「見つける」のように見えます。 $ dir内の_all_ファイルが$ userによって読み込み可能であることをテストするにはどうすればよいですか? – Michael

+0

@Michael上記の編集を参照してください。 – devnull

+0

ありがとうございます。それは今働きます。 – Michael

4
  1. ここに欠けている何かがあるようです。

    if [ $? -ne ]; then 
    

    は、きっとあなたが書くためのもの:

    if [ $? -ne 0 ]; then 
    

    しかし、もしあなたが||を使用することができますので、実際にテストする必要はありません。

    su -m $user -c "test -r $dir && test -x $dir" || 
    echo "$dir is not readable or executable" 
    
  2. の代わりに:

    test -r $dir && test -x $dir 
    

    あなたはtest-aオプション(論理と)を使用することができます。

    test -r $dir -a -x $dir 
    
  3. 変数$userはどこから来たのですか?それは信頼されていますか?そうでない場合は、誰かがroot;のような値を提供すると問題が発生します。あなたは$user、この場合にはOKであることを確信している場合でも、それはまだシェルスクリプトであなたの変数を引用するのが習慣になって価値がある:あなたが書かれていた場合、ここであなたは安全であると思います:

    su -m "$user" -c "..." 
    
  4. 同様のがあります$dirが信頼できない場合の問題 - 誰かが/; shのような値を提供する可能性があります。しかし、この場合には、このようにそれを引用することは動作しません。

    su -m "$user" -c "test -r '$dir' -a -x '$dir'" 
    

    誰かが/'; sh; echo 'のような価値を提供する可能性があるため。代わりに、あなたは安全に$1を使用するためにあなたがして参照することができ、パラメータとしてサブシェルに引用され"$dir"を渡す必要があります:

    su -m "$user" -c 'test -r "$1" -a -x "$1"' -- "$dir" 
    
+0

ありがとう!これはから学ぶための素晴らしい答えです – Michael

関連する問題