не работает скрипт sh

На самом деле это единственный раздел про unix на этом форуме

Модератор: /dev/random

Аватара пользователя
bars
Сообщения: 456
ОС: BSD/LINUX

не работает скрипт sh

Сообщение bars »

Привет.
Подскажите что не так делаю?
не работает, ип адреса не добавляются в файл.

Код: Выделить всё

#!/bin/sh
BOTS="APIs-Google|Yahoo!|AdsBot-Google|Applebot|Google Favicon|Googlebot|Mediapartners-Google|FeedFetcher-Google|Google-Read|DuplexWeb-Google|googleweblight|Storebot-Google|YandexBot"
DTD=`egrep "$BOTS" /var/log/nginx/access_log`

for f in "$DTD"
do

IP=`awk ' {print $1} ' "$f" | sort -u`
echo "$IP" > /mnt/bots.txt

done
exit 0
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:

Zer0
Сообщения: 151
ОС: Void, Slackware

Re: не работает скрипт sh

Сообщение Zer0 »

bars писал:
13.09.2021 16:24
ип адреса не добавляются в файл.
А не в файл? В stdout будет их видно? Если

Код: Выделить всё

echo "$IP" > /mnt/bots.txt
заменить на

Код: Выделить всё

echo "$IP"
Спасибо сказали:

Аватара пользователя
bars
Сообщения: 456
ОС: BSD/LINUX

Re: не работает скрипт sh

Сообщение bars »

Zer0 писал(а):
13.09.2021 16:33
echo "$IP"
не показывает.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 18639
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: не работает скрипт sh

Сообщение Bizdelnick »

awk читает стандартный ввод, а Вы ему аргументом пытаетесь строки подсовывать. И не понял, на кой там sort, если обрабатываете по одной строке. Что он сортировать-то должен?
Делайте всё одним конвейером grep|awk|sort>файл, без цикла. А ещё лучше grep|awk замените на awk '/регулярка/{…}'.
Последний раз редактировалось Bizdelnick 13.09.2021 16:47, всего редактировалось 1 раз.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
bars
Сообщения: 456
ОС: BSD/LINUX

Re: не работает скрипт sh

Сообщение bars »

не работает.
IP=`awk ' {print $1} ' "$f" | sort -u`
В stdout в этом случае видна информация переменной $f.
Но почему переменная $f не обрабатывается, не пойму, запутался уже.
Надо чуть отдохнуть что бы мысли перешли в правильное русло, что то не то сейчас делаю.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:

Аватара пользователя
bars
Сообщения: 456
ОС: BSD/LINUX

Re: не работает скрипт sh

Сообщение bars »

Bizdelnick писал:
13.09.2021 16:45
awk читает стандартный ввод, а Вы ему аргументом пытаетесь строки подсовывать. И не понял, на кой там sort, если обрабатываете по одной строке. Что он сортировать-то должен?
Делайте всё одним конвейером grep|awk|sort>файл, без цикла. А ещё лучше grep|awk замените на awk '/регулярка/{…}'.
точно.
IP=`echo "$f" | awk '{print $1}'`
Добавлено (17:09):
А как теперь правильно пердать переменную IP для проверки ptr записи ip.
Делаю скрипт для проверки ip адресов на правильный юзер агент.
for f in "$DTD"
do

IP=`echo "$f" | awk '{print $1}'`
PTR=`host "$IP" | egrep -v alias | awk '{print $1,$2}'`
echo "$PTR" > /mnt/bots.txt
done

Хочу сделать файл где будет фигурировать, из лога,
IP - PTR запись домена - юзер агент
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:

Аватара пользователя
bars
Сообщения: 456
ОС: BSD/LINUX

Re: не работает скрипт sh

Сообщение bars »

Bizdelnick писал:
13.09.2021 16:45
Делайте всё одним конвейером grep|awk|sort>файл, без цикла.
Хмм, не думаю что такое возможно сделать без цикла.
По порядку что есть.
Лог файл /var/log/nginx/access_log с содержимым

Код: Выделить всё

50.246.127.57 "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0"
5.45.207.152 "Mozilla/5.0 (compatible; YandexImages/3.0; +http://yandex.com/bots)"
Есть задача про парсить лог, отфильтровать ботов белых (яндекс/гугл/маил и т.д.) и добавлением в него реверс зоны ип адреса с юзер агентом.

Код: Выделить всё

5.45.207.152  152.207.45.5.in-addr.arpa  "Mozilla/5.0 (compatible; YandexImages/3.0; +http://yandex.com/bots)"
Ломаю голову как лучше сделать.
Без цикла, по отдельности не сложно это сделать, а вот как слепить все 3 переменные ip revers_zone юзер_агент.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 18639
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: не работает скрипт sh

Сообщение Bizdelnick »

bars писал:
13.09.2021 19:58
как слепить все 3 переменные ip revers_zone юзер_агент
И в чём проблема с кодом, приведённым Вами чуть выше?
bars писал:
13.09.2021 16:50
for f in "$DTD"
do

IP=`echo "$f" | awk '{print $1}'`
PTR=`host "$IP" | egrep -v alias | awk '{print $1,$2}'`
echo "$PTR" > /mnt/bots.txt
done
Ну кроме того, что на формат выхлопа host я бы полагаться не стал.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
bars
Сообщения: 456
ОС: BSD/LINUX

Re: не работает скрипт sh

Сообщение bars »

Bizdelnick писал:
13.09.2021 22:19
И в чём проблема с кодом, приведённым Вами чуть выше?

Код: Выделить всё

for f in "$DTD"
do

IP=`echo "$f" | awk '{print $1}'`
PTR=`host $IP | egrep -v alias | awk '{print $1}'`
echo "$PTR" >> /mnt/bots.txt

done
Содержимое файла после запуска скрипта.

Код: Выделить всё

cat /mnt/bots.txt 
;;
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:

Аватара пользователя
olecya
Сообщения: 494
ОС: debian, fedora (i3-wm)

Re: не работает скрипт sh

Сообщение olecya »

Идите по порядку. Зачем прыгать в продакшен?

Код: Выделить всё

#!/bin/sh
BOTS="APIs-Google|Yahoo!|AdsBot-Google|Applebot|Google Favicon|Googlebot|Mediapartners-Google|FeedFetcher-Google|Google-Read|DuplexWeb-Google|googleweblight|Storebot-Google|YandexBot"
egrep "$BOTS" /var/log/nginx/access_log
Оставьте незакомиченным вот это. Получаете на выходе то что хотите?

Добавлено:
Если все нормально продвигаетесь дальше:

Код: Выделить всё

egrep "$BOTS" /var/log/nginx/access_log | cut -d' ' -f1 | sort -u
И дальше:

Код: Выделить всё

for IP in $(egrep "$BOTS" /var/log/nginx/access_log | cut -d' ' -f1 | sort -u); do
    echo ${IP}
done
И т.д.
Спасибо сказали:

Аватара пользователя
bars
Сообщения: 456
ОС: BSD/LINUX

Re: не работает скрипт sh

Сообщение bars »

Это понятно, можно ип адреса отфильтровать и так.

Код: Выделить всё

egrep "$BOTS" /var/log/nginx/access_log | awk '{print $1}' | sort -u
Но как мне слепить после файл?

Код: Выделить всё

echo "$IP $PTR $USER_AG" > /mnt/bots.txt
Что бы данные соответствовали друг другу.
Такое возможно сделать только в цикле.
По отдельности вытянуть эти данные не трудно, а вот как слепить их в один файл, пока не понимаю как это сделать.
Добавлено (12:14):
Содержимое лога.

Код: Выделить всё

77.88.5.115 "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)"
66.249.64.82 "Googlebot-Image/1.0"
66.249.64.82 "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
213.180.203.251 "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)"
66.249.64.82 "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
Нужно привести к такому виду.

Код: Выделить всё

77.88.5.115 - 115.5.88.77.in-addr.arpa - "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)"
66.249.64.82 - 82.64.249.66.in-addr.arpa - "Googlebot-Image/1.0"
66.249.64.82 - 82.64.249.66.in-addr.arpa - "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
213.180.203.251 - 251.203.180.213.in-addr.arpa - "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)"
66.249.64.82 - 82.64.249.66.in-addr.arpa - "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:

Аватара пользователя
olecya
Сообщения: 494
ОС: debian, fedora (i3-wm)

Re: не работает скрипт sh

Сообщение olecya »

bars
Покажите полный вывод на вашей системе:

Код: Выделить всё

host 77.88.5.115
И какая версия awk
Спасибо сказали:

Аватара пользователя
bars
Сообщения: 456
ОС: BSD/LINUX

Re: не работает скрипт sh

Сообщение bars »

olecya писала:
14.09.2021 12:53
host 77.88.5.115
host 77.88.5.115
115.5.88.77.in-addr.arpa domain name pointer 77-88-5-115.spider.yandex.com.

awk -version
awk version 20190529 (FreeBSD)
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:

Аватара пользователя
olecya
Сообщения: 494
ОС: debian, fedora (i3-wm)

Re: не работает скрипт sh

Сообщение olecya »

Попробуйте вот такой вариант, если все правильно перенаправьте вывод в файл:

Код: Выделить всё

#!/bin/bash
BOTS="APIs-Google|Yahoo!|AdsBot-Google|Applebot|Google Favicon|Googlebot|Mediapartners-Google|FeedFetcher-Google|Google-Read|DuplexWeb-Google|googleweblight|Storebot-Google|YandexBot"
awk -v bot="$BOT" '
$0 ~ bot	{cmd = "host "$1" | cut -d\" \" -f1"
		cmd | getline d
		$1 = $1 " - " d " -"
		print
		close(cmd)
		}
' /var/log/nginx/access_log
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 18639
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: не работает скрипт sh

Сообщение Bizdelnick »

bars писал:
14.09.2021 09:34

Код: Выделить всё

for f in "$DTD"
do

IP=`echo "$f" | awk '{print $1}'`
PTR=`host $IP | egrep -v alias | awk '{print $1}'`
echo "$PTR" >> /mnt/bots.txt

done
Содержимое файла после запуска скрипта.

Код: Выделить всё

cat /mnt/bots.txt 
;;
Значит, Вы неправильно разбираете выхлоп host. Очень может быть, что он выглядит вот так:

Shell

% host 5.45.207.152
;; connection timed out; no servers could be reached

%
И, повторюсь, я вообще не стал бы на него завязываться.
Добавлено (14:01):
bars писал:
14.09.2021 13:07
host 77.88.5.115
115.5.88.77.in-addr.arpa domain name pointer 77-88-5-115.spider.yandex.com.
А на фига Вы берёте отсюда 115.5.88.77.in-addr.arpa? Вам же надо 77-88-5-115.spider.yandex.com.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
olecya
Сообщения: 494
ОС: debian, fedora (i3-wm)

Re: не работает скрипт sh

Сообщение olecya »

Bizdelnick писал:
14.09.2021 13:59
А на фига Вы берёте отсюда 115.5.88.77.in-addr.arpa? Вам же надо 77-88-5-115.spider.yandex.com.
Тогда лучше так:

Код: Выделить всё

dig -x 77.88.5.115 +short
Вырезать не надо и ошибка не должна выводится
Добавлено (14:41):
Опаньки во фряхе не работает. Одну минутку...
Добавлено (14:47):
bars Какая-то проблема в динамической либе с утилитами dig и nslookup. Не хочу копаться поэтому оставляю проверить работу в вашей системе
Спасибо сказали:

Аватара пользователя
bars
Сообщения: 456
ОС: BSD/LINUX

Re: не работает скрипт sh

Сообщение bars »

Bizdelnick писал:
14.09.2021 13:59
115.5.88.77.in-addr.arpa
Этот выхлоп для чего-то нужен старшему менеджеру проектов.
Добавлено (15:44):
Пока отказался от слияния ip+ptr+user_agenta
User_agent будет в отдельном файле все в вместе.
А ip + ptr.

Код: Выделить всё

DTD=`egrep "$BOTS" /var/log/nginx/access_log | awk '{print $1}' | sort -u`
egrep "$BOTS" /var/log/nginx/access_log > /mnt/mon_bots/all_$DT

for b in $DTD
do

HO=`host $b | egrep -v alias | awk '{print $1" - "$5}'`
echo "$b - $HO" >> /mnt/mon_bots/process_$DT
done
Получилось так.

Код: Выделить всё

77.88.5.48 - 48.5.88.77.in-addr.arpa - 77-88-5-48.spider.yandex.com.
93.158.130.161 - 161.160/27.130.158.93.in-addr.arpa - resizer01sas.resize.yandex.net.
93.158.130.162 - 162.160/27.130.158.93.in-addr.arpa - resizer02sas.resize.yandex.net.
Но все равно мне просто интересно, как или через что лучше сделать слияние переменных $IP $PTR $USER_AG, что бы данные соответствовали друг другу.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 18639
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: не работает скрипт sh

Сообщение Bizdelnick »

bars писал:
14.09.2021 15:33
Этот выхлоп для чего-то нужен старшему менеджеру проектов.
Это не выхлоп, а вхлоп (запрос, а не ответ). Он формируется из IP-адреса и не содержит никакой информации, которой бы в нём не было. Так что рекомендую воспользоваться советом olecya, пока нагоняй от страшного манагера не получили.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали: