if语句对许多argumnets起作用

时间:2017-03-03 17:27:33

标签: bash

我忽略了我的程序,因为任何错误而找不到任何错误。通常当我遇到BASH的错误时,解释器就会出现错误。我正在尝试使用Linux Scripts来监视安全性,从SANS InfoSec自定义此脚本。在检查功能查看不同协议的部分之前,一切都很好。当我取消注释它们时,我得到错误:./ report:第41行:[:太多的参数。这是程序......

{{1}}

有些行被注释掉以供稍后调整。现在我的问题是协议。不知道出了什么问题,因为我觉得这个函数有3个参数。

2 个答案:

答案 0 :(得分:0)

在您对check的最后三次调用中,您错过了运算符和操作数之间所需的空格。

check ssh `grep \ 22$ $PWD/router.log | wc -l` '=0'
check smtp `grep \ 25$ $PWD/router.log | wc -l` '=0'
check dns `grep \ 53$ $PWD/router.log | wc -l` '=0'

所有这些的最后一个论点应该是'= 0'

但是,这不是构建代码的好方法。如果您确实需要完全参数化比较(所有调用都使用=作为操作),请将运算符作为单独的参数传递。此外,如果写得正确,则无需预先检查$2是否为非空字符串。

check() {
  if [ "$2" "$3" "$4" ] ; then
    printf '%s%s%s ' "$green" "$1" "$white"
  else
    printf '%s%s%s ' "$red" "$1" "$white"
    printf '%s %s was not %s\n' "$(date)" "$1" "$3" >> "$report"
  fi
}

然后你的检查电话应该是

check hostname "$(hostname -s)" = localhost
check domain "$(hostname -d)" = domain.com
check ipaddress "$(hostname -I | cut -d" " -f1)" = 10.10.0.6
check gateway "$(netstat -nr | grep ^0.0.0.0 | cut -c17-27)" = 10.10.0.1

通过http://shellcheck.net运行您的代码;你可以纠正很多事情。

答案 1 :(得分:0)

这是我的另一个问题。为了看看发生了什么,我稍微改了一下。

router=/home/chron/Desktop/router.log

check() {
if [ "$2" "$3" "$4" ]; then
  printf "%s%s%s" "$green" "$1" "$white"
else
  printf "%s%s%s" "$red" "$1" "$white"
  printf "%s %s was not %s\n" "$(date)" "$1" $3" >> report.log
fi

check gateway "$(route | grep 10.10.0.1 | cut -c17-27)" = 10.10.0.1

check telnet "$(grep -c \ 23$ $router)" = 0
check ftp "$(grep -c \ 21$ $router)" = 0
check ssh "$(grep -c \ 22$ $router)" = 0
check smtp "$(grep -c \ 25$ $router)" = 0
check dns "$(grep -c \ 53$ $router)" = 0