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
Run Code Online (Sandbox Code Playgroud)
现在,它会为找到的每个文件打印“Pass”。如果所有文件都归root拥有,我想打印“Pass”,如果列表中的任何用户或组不是root,则打印“Fail” 。
小智 6
如果你想知道你的所有文件是否都归 root 所有并属于组 root,请使用 find:
find <path to files> ! -user root -or ! -group root -print
Run Code Online (Sandbox Code Playgroud)
如果返回任何内容,则该文件要么不归 root 所有,要么不属于组 root。然后,您可以将其放入条件子句中以打印出通过或失败。
[[ "$(find <path to files> ! -user root -or ! -group root -print)" == "" ]] && echo "Pass" || echo "Fail"
Run Code Online (Sandbox Code Playgroud)
小智 5
首先,您不应该解析 的输出ls及其变体。你可以使用stat:
$ stat -c%U-%G ./*
tomasz-tomasz
tomasz-tomasz
tomasz-tomasz
Run Code Online (Sandbox Code Playgroud)
如您所见,结果是一个由两个单词连接而成的可靠列表,您可以对其进行操作以获得所需的结果。把它放到一个循环中,然后你去:
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
Run Code Online (Sandbox Code Playgroud)
的值i需要root-root使循环在开关不变的情况下结束。
替换./*为the_dir/*以测试另一个位置。
在-需要分离,因为,脾气坏的人在评论中指出,该字符串比较可能,如果该文件是由“袋鼠”和组“troot”拥有,所以失败的隔膜仍然会是一件好事。
熟悉这一点:为什么*不*解析`ls`(以及该怎么做)?