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"