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
现在,它会为找到的每个文件打印“Pass”。我想打印“通过”如果全部文件的所有者是根,并打印“失败”如果任何列表中的用户或组不是根。
答案1
如果你想查明你的所有文件是否都属于 root 并属于 root 组,请使用 find:
find <path to files> ! -user root -or ! -group root -print
如果返回任何内容,则该文件要么不属于 root,要么不属于组 root。然后,您可以将其放入条件子句中以打印出“通过”或“失败”。
[[ "$(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
正如您所看到的,结果是两个单词连接的可靠列表,您可以对其进行操作以获得所需的结果。将其放入循环中,然后就可以了:
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”组中,则字符串比较可能会失败,因此分隔符仍然是一件好事。
答案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
在 shellscript 中用于此目的。
- 参数
find -printf
中描述man find
。 - 标准输出通过管道传送到
grep
,退出状态存储在 中norootfile
。 - 输出也会写入临时文件,并对行数进行计数并存储在
numfile
(找到的文件数)中。 - 您可以使用“verbose”选项
-v
从 shellscript 的输出中获取更多详细信息。
如果您还想搜索隐藏文件,请使用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"