我正在尝试编写一个简单的Bash脚本来帮助我验证一些Windows注册表设置。所有数据都在文件夹中(这是计算机的主机名),并且位于脚本中指定的路径中。最终目标是根据行末的注册表项值验证错误设置值的主机。
作为脚本的参考,参数一是我想要查找的注册表项,参数二是它应该是的值。如果$control
与$value
字符串末尾的匹配,那么它应输出机器名称,即变量$FOLDER
list=$(ls)
regkey=$1
control=$2
for FOLDER in $list
do
value=$($FOLDER/policies/Effective-Security-policy.txt | grep "$regkey")
if [[ "$value" =~ $control ]] ;
then
echo $FOLDER
else
continue
fi
done
但是,我不能让它进行严格的比较,因为还有一个名为RestrictAnonymousSAM
的注册表项,它会列出不正确的值。
以下是文本文件中的一些行,我需要能够区分这两行,因此返回的值是针对该特定注册表项的:
MACHINE\System\CurrentControlSet\Control\Lsa\RestrictAnonymous=4,0
MACHINE\System\CurrentControlSet\Control\Lsa\RestrictAnonymousSAM=4,1
答案 0 :(得分:0)
如果我理解你正在尝试做什么,我认为你应该写:
regkey="$1"
control="$2"
for FOLDER in * ; do
file="$FOLDER/policies/Effective-Security-policy.txt"
if iconv -s -f utf-16 -t utf-8 "$file" \
| grep -q '^[^=]*\\'"$regkey=$control$"
then
echo "$FOLDER"
fi
done
grep -q
在文件中搜索与模式匹配的行,但不将其打印出来。这使得它非常适合在if
- 测试中使用,因为grep
如果找到匹配并且0
(错误/假),则返回1
(成功/ true)如果没有。
(重要说明:以上假设$regkey
和$control
不能包含grep
可能特别处理的任何元字符。如果可以,则这变得更加棘手。)