使用模式中的制表符空间在sudoers文件中进行模式匹配

时间:2016-09-22 12:06:29

标签: bash shell awk sed grep

我需要编写一个shell脚本来检查/ etc / sudoers文件中是否存在条目

这是我需要检查的模式 nimbus ALL =(ALL)NOPASSWD:ALL

在这种模式中,单词标签空间是

如何找到文件/ etc / sudoers中存在的模式或不使用仅来自root用户的linux shell脚本

  SomeString='nimbus      ALL=(ALL)       NOPASSWD:ALL'
File=sudoers
echo $File
echo -e $SomeString

if grep -q $SomeString "$File"; then
   echo "line found"
else
   echo "line not found"
fi

错误我得到了grep:ALL =(ALL):没有这样的文件或目录grep:NOPASSWD:ALL:没有这样的文件或目录

请在这方面帮助我

感谢 Sagar的

1 个答案:

答案 0 :(得分:1)

您的脚本存在的问题是,您没有转发(\)元字符(在这种情况下为()grep来识别它们因为它们有特殊的含义。

引用变量也可以防止分词和全局扩展,并且当输入包含空格,换行符,glob字符等时,可以防止脚本中断。

脚本的修改版本应该像

#!/bin/bash

SomeString='nimbus      ALL=\(ALL\)       NOPASSWD:ALL'      # Notice the '\' of the characters
File=sudoers
echo "$File"
echo -e "$SomeString"

if grep -qE "$SomeString" "$File"; then
    echo "line found"
else
    echo "line not found"
fi

通过此更改,您的脚本可以正常运行。

$ cat sudoers
nimbus      ALL=(ALL)       NOPASSWD:ALL
foo
bar

foobar

$ ./script.sh
sudoers
nimbus      ALL=\(ALL\)       NOPASSWD:ALL
line found

详细了解grep-regular-expressions