見つかった各ファイルが指定されたテスト条件を満たしている場合にのみエコーされるようにbashスクリプトのテストを修正しました。

見つかった各ファイルが指定されたテスト条件を満たしている場合にのみエコーされるようにbashスクリプトのテストを修正しました。
for x in $(ls -ll <path to files> | awk '{ print $3,$4 }' | tail -n +2) ; do 
  if [ "${x}" != "root" ] ; then
    echo "Fail"
    break
  else
    echo "Pass"
 fi
done

これで、見つかったすべてのファイルに「パス」を印刷します。次のような場合は「passed」を印刷したいと思います。みんなファイルの所有者はそして、次のような場合は「失敗」を印刷します。どのリスト内のユーザーまたはグループではありません。

答え1

すべてのファイルがルートに属し、ルートグループに属していることを確認するには、 find を使用します。

find <path to files> ! -user root -or ! -group root -print

何も返されない場合、ファイルはルートに属していないか、グループルートに属しません。その後、条件を付けて「パス」または「フェイル」を印刷できます。

[[ "$(find <path to files> ! -user root -or ! -group root -print)" == "" ]] && echo "Pass" || echo "Fail"

答え2

まず、出力lsとそのバリアントを解析しないでください。この問題を解決するには、次の方法を使用できますstat

$ stat -c%U-%G ./*
tomasz-tomasz
tomasz-tomasz
tomasz-tomasz

ご覧のとおり、結果は、目的の結果を得るために操作できる2つの単語接続の堅牢なリストです。ループに入れるといいですね。

PASS=true
for i in $(stat -c%U-%G ./*); do
    if ! [[ "$i" == root-root ]]; then
        PASS=false; break
    fi
done
if "$PASS"; then
    echo Pass
else
    echo Fail
fi

スイッチを変更せずにループがエンドポイントに到達するには、の値がi必要です。root-root

./*別の場所をテストするにはに置き換えますthe_dir/*

-Grumpがコメントで指摘したように、区切り文字が必要です。ファイルが「roo」に属し、「troot」グループにある場合、文字列の比較が失敗する可能性があるため、区切り文字はまだ良いことです。

次のことに慣れてください。`ls`が解析されないのはなぜですか(代わりに何をすべきですか?)

答え3

どうですか?

[ 1 = $({ echo root:root; stat -c"%U:%G" *; } | sort -u | wc -l) ] && echo PASS || echo FAIL

編集する: または

[ -z $(stat -c"%U:%G" * | grep -vm1 root:root) ] && echo PASS || echo FAIL

答え4

lsコマンドラインの出力は危険です。findこの目的のためにシェルスクリプトを使用することをお勧めします。

  • パラメータがfind -printf説明されていますman find
  • 標準出力はパイプで接続され、終了ステータスgrepはに保存されますnorootfile
  • 出力は一時ファイルにも書き込まれ、行数が計算されnumfile(見つかったファイル数)に保存されます。
  • 「verbose」オプションを使用すると、-vシェルスクリプトの出力からより詳細な情報を取得できます。

隠しファイルも検索するにはfind .代わりに使用します。find *

サブディレクトリから検索したくない場合は、-maxdepth 1コマンドラインで find を使用してください。

#!/bin/bash

if [ "$1" == "-h" ]
then
 echo "Usage: $0 -h  # this help text"
 echo "       $0 -v  # verbose output"
 exit
fi

tmpfil=$(mktemp)

find * -xtype f -printf "%u:%g  %p\n" | tee "$tmpfil" | grep -v '^root:root' > /dev/null

norootsfile=$?
numfile=$(wc -l "$tmpfil")
#cat "$tmpfil"

if [ ${numfile%% *} -eq 0 ]
then
 echo "No file found; check the current directory"
elif [ $norootsfile -eq 0 ]
then
 echo "Fail"
 if [ "$1" == "-v" ]
 then
  echo "----- Found some file(s) not owned or grouped by root"
  echo "user:group file-name --------------------------------"
  grep -v '^root:root' "$tmpfil"
 fi
else
 echo "Pass"
 if [ "$1" == "-v" ]
 then
  echo "----- Found only files owned or grouped by root"
 fi
fi
rm "$tmpfil"

関連情報