我需要验证特定文件系统是否设置了 noexec 选项。
例如/dev/shm
。我按以下方式运行命令:
get_val=$(mount|grep /dev/shm )
if [[ -z get_val ]] ; then
# Error
else
value=$(echo "${get_val}" | cut -d " " -f 6 | grep noexec)
if [ "${value}" = "" ]; then
# Not set
else
# Set
fi
fi
get_val的值类似于devshm on /dev/shm type devshm (rw,noexec,nosuid,gid=5,mode=0620)
接下来我要做的是检查gid
和mode
是否已设置为某个值。但是,通过上述步骤,我只能检查是否设置了选项。
所以我尝试了这个:
echo "${get_val}"| cut -d " " -f 6 | awk -F, '{
if ($4 == "gid=123"){
print 1;
}
else
{ print 0;}
if ($5 == "mode=123)"){
print 1;
}
else
{ print 0;}'
然而,这似乎太麻烦了,我不确定这样做的最好方法是什么。
还可以在文件系统中设置其他参数,例如nodev等,这将使$ 5或$ 2不同。
有什么建议吗?
答案 0 :(得分:1)
看起来你真的应该转向Awk,即使是基本处理。
if mount | awk '$1 == "/dev/shm" && $6 ~ /(^|,)noexec(,|$)/ &&
$6 ~ /(^|,)gid=123(,|$)/ && $6 ~ /(^|,)mode=123(,|$)/ { exit 0 }
END { exit 1 }'
then
echo fine
else
echo fail
fi
(^|,)
和(,|$)
锚点是为了确保匹配可以用逗号或字段的开头/结尾括起来,以避免部分匹配(例如mode=1234
)。
让Awk设置其返回代码,以便在if
条件下以惯用方式使用它有点麻烦,但这是一个很好的总体思路。
答案 1 :(得分:0)
为什么不直接对[[
使用globbing:
[[ ${get_val} == *\(*gid=5*\)* ]] && echo 'Matched'
同样,使用“mode = 0620”:
[[ ${get_val} == *\(*mode=0620*\)* ]] && echo 'Matched'
如果您更喜欢Regex方式:
[[ ${get_val} =~ \(.*gid=5.*\) ]] && echo 'Matched'
[[ ${get_val} =~ \(.*mode=0620.*\) ]] && echo 'Matched'
答案 2 :(得分:0)
很抱歉,如果这是愚蠢的,但不像
那么简单mount | grep -E '^/dev/shm.*noexec' && value=1
((value)) && #Do something useful
如果您想检查多个字段,可以像下面一样管道grep:
mount | grep -E '^/dev/shm.*noexec' \
| grep -E 'gid=5.*mode=0620|mode=0620.*gid=5' >/dev/null && value=1
((value==1)) && #Do something useful