Как скрыть IP от отчета 404 awk, когда последнее значение имеет только 2 цифры - PullRequest
0 голосов
/ 16 мая 2018

У меня есть скрипт, который ищет 404 кода состояния HTTP в моем журнале доступа. Тем не менее, команда безопасности имеет скрипт, который ищет уязвимости, которые вызывают 100 из 404 записей в моих журналах. Я отфильтровываю IP-адрес их тестовых блоков, чтобы избежать ложных срабатываний. Но они недавно добавили новый сервер. Проблема в том, что IP-адрес этого нового сервера имеет только 2 цифры для последней части. (т.е. 10.1.1.18 - это не IP, но вы поняли).

Как получить awk или grep, чтобы игнорировать IP-адрес, заканчивающийся 18, а не действительные IP-адреса 180-189, которые мне нужно искать?

Для тех, кто не знаком с содержимым журнала доступа HTTP, приведу следующий пример:

10.1.1.18 - - [12 / май / 2018: 01: 25: 07 -0600] "GET /xampp/cgi.cgi HTTP / 1.1" 404 909

Я попытался процитировать IP-адрес, чтобы включить пробел после 18, например:

cat access.log | grep -v "10.10.10.230" | grep -v "10.10.11.116" | grep -v "10.1.1.18" | awk -f report_errors.awk

Но тогда я не получаю вывод из скрипта awk. Почему пробел в цитируемом исключении grep может привести к смерти awk? Когда я удаляю команду awk с конца, я получаю правильное содержимое файла access.log (что означает, что записи тестового сервера были правильно удалены).

Я не знаю, что я делаю не так. Ниже приведен файл report_errors.awk:

BEGIN {
  FS = "\""
  title = "HTTP sslaccess_log:\n"
  flag = 0
  error = 0
  error400 = 0
  error408 = 0
  error500 = 0
  site = 0
  separator = ""
  allERRORS = ""
}
function qsortA(array,min,max) {
  if (min > max) {
    return
  }

  m = min
  for (knx = (min + 1) ; knx <= max ; knx++) {
    if (array[knx] < array[min]) {
      swap(array,++m,knx)
      swap(array,min,m)
    }
  }
  qsortA(array,min,(m - 1))
  qsortA(array,(m + 1),max)
}

function swap(array,ind1,ind2) {
 sw = array[ind1]
 array[ind1] = array[ind2]
 array[ind2] = sw
}

$3 ~ / 404 / {
  printf( "%s", title)
  if ( $2 ~ /site/ || $2 ~ /dot.gif/ || $2 ~ /maintenance/ || $2 ~ /graypixel.gif/ || $2 ~ /.css/ || $2 ~ /crossdomain.xml/  || $2 ~ /OPTIONS/ )
  {
    split( $2, name, " " )
    msg = substr(name[1],0,1) " " name[2]
    if ( index( allERRORS, msg) == 0 )
    {
      allERRORS = allERRORS separator msg
      separator = ","
    }
    arrCOUNT[msg]++
    site=1
  }
  else
  {
    print " - " $0
    error++
  }
  title = ""
  flag++
}
$3 ~ / 400 / {
  error400++
}
$3 ~ / 408 / {
  error408++
}
$3 ~ / 500 / {
# printf( "%s", title)
# print " - " $0
  error500++
# title = ""
# flag++
}
END {
  if (flag > 0) {
    if (error > 0) {
      printf("---- %4d: basic errors\n", error)
      printf("---- %4d: 400 errors\n", error400)
      printf("---- %4d: 408 errors\n", error408)
      printf("---- %4d: 500 errors\n", error500)
    }
    if (site = 1)
    {
      split( allERRORS, arrERRORS, "," )
      jnx = 0
      for ( inx in arrERRORS )
      {
        arrNew[++jnx] = arrERRORS[inx]
      }
      qsortA(arrNew,1,jnx)
      inx = 0
      while ( inx < jnx )
      {
        printf("---- %4d: %s\n",arrCOUNT[arrNew[++inx]],arrNew[inx])
      }
    }
    printf("---- %4d: Total 404 Errors\n",flag)
  }
}

Любой совет?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Чтобы получить все журналы, содержащие 404 ошибки, пропускающие те, которые имеют IP-адреса, заканчивающиеся 2 цифрами, используя grep:

$ grep 404 access.log | grep -v '\d*\.\d*\.\d*\.\d\d[^0-9]'
0 голосов
/ 16 мая 2018

Чтобы пропустить IP-адрес, заканчивающийся 2 цифрами:

/^([0-9]+\.){3}[0-9]{2}[[:space:]]/ { next }

кстати:

cat access.log | grep -v "10.10.10.230" | grep -v "10.10.11.116" | grep -v "10.1.1.18 " | awk 'foo'

необходимо экранировать метачары RE:

cat access.log | grep -v "10\.10\.10\.230" | grep -v "10\.10\.11\.116" | grep -v "10\.1\.1\.18 " | awk 'foo'

и на самом деле должно быть записано так:

awk '/10\.10\.10\.220|10\.10\.11\.116|10\.1\.1\.18 /{next} foo' access.log

но я подозреваю, что вы действительно хотите:

awk '/^10\.(10\.10\.(220|116)|1\.1\.18[[:space:]])/{next} foo' access.log
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...