Используйте AWK для чтения дубликатов в столбце

Нет (общеизвестного )пароля для пользователя по умолчанию

Нет (общеизвестного )пароля для пользователя по умолчанию в разновидностях и дистрибутивах на основе Ubuntu. При запросе пароля, например, для запуска sudo, вы просто нажимаете клавишу Enter. Но ssh хочет пароль, поэтому не получается войти удаленно по ssh в постоянный живой диск.

Создать второго пользователя с паролем

Я нашел способ подключиться к постоянно работающему дистрибутиву на основе Ubuntu через ssh. Я протестировал последний iso-файл Lubuntu Eoan (, который будет выпущен как 19.10 ), но я думаю, что этот метод является общим и должен работать для многих версий, разновидностей и обновлений -на основе Ubuntu, включая Linux Mint.

  • Создайте постоянный живой диск с mkusb из вашего iso-файла.
  • Загрузитесь в вашу постоянную живую систему
  • Установить инструменты

    sudo apt update
    

    Получить пакеты (, если они у вас уже есть)

    sudo apt install gnome-system-tools
    

    чтобы получить users-adminи конечно же

    sudo apt install openssh-server
    

    Живому пользователю по умолчанию не требуется пароль для запуска sudo, просто нажмите клавишу Enter, когда он запросит пароль.

  • Создать второго пользователя

    users-admin
    

    и следуйте инструкциям в графическом интерфейсе пользователя. Выберите хороший пароль, состоящий не менее чем из 8 символов.

  • Теперь у вас есть ssh-сервер и пользователь с паролем,и вы можете удаленно войти в свою постоянную живую систему:-)

  • Подключитесь к вашей сети и определите свой IP-адрес

    ip a
    

    Я нашел следующий адрес:192.168.1.10

Демонстрационный вход и выход

sudodus@m4800:~$ ssh tester@192.168.1.10
tester@192.168.1.10's password: 
Welcome to Ubuntu Eoan Ermine (development branch) (GNU/Linux 5.2.0-15-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

Last login: Thu Sep 19 07:39:18 2019 from 192.168.1.2
tester@lubuntu:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu Eoan Ermine (development branch)
Release:    19.10
Codename:   eoan
tester@lubuntu:~$ su - lubuntu
Password: 
lubuntu@lubuntu:~$ sudo df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            1.9G     0  1.9G   0% /dev
tmpfs           383M  1.4M  382M   1% /run
/dev/sdb4       1.7G  1.7G     0 100% /cdrom
/dev/loop0      1.6G  1.6G     0 100% /rofs
/cow            9.6G  362M  8.7G   4% /
tmpfs           1.9G  7.4M  1.9G   1% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
tmpfs           1.9G     0  1.9G   0% /tmp
tmpfs           383M  8.0K  383M   1% /run/user/999
/dev/sdb5       9.6G  362M  8.7G   4% /media/lubuntu/casper-rw
/dev/sdb1       3.3G   18M  3.3G   1% /media/lubuntu/usbdata
tmpfs           383M  4.0K  383M   1% /run/user/1000
lubuntu@lubuntu:~$ 

Вы видите, что корневая файловая система /имеет те же свойства, что и раздел casper-rw. Это указывает на то, что это постоянная живая система. Вы также можете видеть, что здесь можно переключить пользователя на пользователя по умолчанию ('lubuntu' ).

9
04.11.2020, 22:03
6 ответов

Использование GNU awk для mktime():

$ cat tst.awk
BEGIN { FS = "|" }
(++count[$2]) ~ /^[15]$/ {
    split($1,t,"[/:]")
    monthNr = (index("JanFebMarAprMayJunJulAugSepOctNovDec",t[2])+2)/3
    currSecs = mktime(t[3] " " monthNr " " t[1] " " t[4] " " t[5] " " t[6])

    if ( count[$2] == 1 ) {
        firstSecs[$2] = currSecs
    }
    else if ( (currSecs - firstSecs[$2]) < 15 ) {
        print $2
    }
}

$ awk -f tst.awk file
000.111.026.111
060.121.125.144

Я думаю, что это очень ясно, что он делает, поэтому нет необходимости добавлять текст, объясняющий это, но если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь спрашивать.

Да, и вы упомянули в комментарии, что хотели бы знать способ преобразования ваших IP-адресов в фиктивные значения, чтобы вы могли опубликовать более полный пример, вот один из способов, который будет достаточно хорош для вашей конкретной проблемы:

$ awk '
    BEGIN { FS=OFS="|" }
    !($2 in map) { ip=sprintf("%012d",++cnt); gsub(/.../,"&.",ip); sub(/.$/,"",ip); map[$2]=ip }
    { $2=map[$2]; print }
' file
29/Oct/2020:07:41:42|000.000.000.001|200|/page-a/
29/Oct/2020:08:30:40|000.000.000.002|200|/page-a/
29/Oct/2020:08:30:44|000.000.000.002|200|/page-b/
29/Oct/2020:08:30:45|000.000.000.002|200|/page-c/
29/Oct/2020:08:30:47|000.000.000.002|200|/page-d/
29/Oct/2020:08:30:47|000.000.000.003|200|/page-h/
29/Oct/2020:08:30:48|000.000.000.002|200|/page-e/
29/Oct/2020:07:41:49|000.000.000.004|200|/page-a/
29/Oct/2020:08:41:52|000.000.000.005|200|/page-f/
29/Oct/2020:08:41:52|000.000.000.005|200|/page-g/
29/Oct/2020:08:41:54|000.000.000.002|200|/page-k/
29/Oct/2020:08:41:55|000.000.000.005|200|/page-l/
29/Oct/2020:08:41:57|000.000.000.005|200|/page-n/
29/Oct/2020:08:41:58|000.000.000.005|200|/page-s/

Редактировать :вот как вы могли бы начать исследовать разницу между выводом, который производит мой скрипт, и выводом, который производит запущенная вами версия скрипта Daves:

$ awk -f morton-botfilter.awk.txt output3test.csv > morton.out
$ awk -f dave-botfilter.awk.txt output3test.csv > dave.out
$ ip=$(comm -13 <(sort morton.out) <(sort dave.out) | head -1)
$ grep "$ip" output3test.csv | head -5
03/Nov/2020:07:52:55|000.000.000.007|200|/page-7/
03/Nov/2020:08:05:32|000.000.000.007|200|/page-11/
03/Nov/2020:11:28:56|000.000.000.007|200|/page-77/
03/Nov/2020:13:52:32|000.000.000.007|200|/page-143/
03/Nov/2020:13:52:33|000.000.000.007|200|/page-144/

Обратите внимание, что между первой и последней отметками времени выше 15 секунд, что говорит о том, что скрипт в dave -botfilter.awk.txt не работает. См. комментарии ниже для получения дополнительной информации.

4
18.03.2021, 22:53

Вы можете получить список уникальных IP-адресов, используя cutи sort, и передать его в цикл while, который запускает большую часть вашего существующего скрипта:

#!/bin/bash

while read addr ; do
    # your scripting here
done < <(cut -d '|' -f 2 input_file | sort -u)

<()— это баш-изм -, так что это не так переносимо.

0
18.03.2021, 22:53

Поскольку вы хотите изучить awk и, по-видимому, GNU awk (gawk ), awk -f script <logfileгде scriptсодержит

BEGIN{ split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec",n2m);
  for(i=1;i<=12;i++) m2n[n2m[i]]=i; FS="|"; }
function fixtime(str,tmp){ split(str,tmp,"[:/]");
  return mktime(tmp[3] OFS m2n[tmp[2]] OFS tmp[1] OFS tmp[4] OFS tmp[5] OFS tmp[6]) }
++count[$2]==1 { first[$2]=fixtime($1) }
count[$2]==5 && fixtime($1)-first[$2]<15 { print $2 }

Первые две строки устанавливают массив m2n (месяц в число ), которое отображает январь в 1, февраль в 2 и т. д., а также устанавливает разделитель полей в |. (Вместо этого можно было бы сделать m2n["Jan"]=1; m2n["Feb"]=2;и т. д., но это более утомительно.

Следующие две строки определяют функцию, которая разбивает ваш формат времени, используя все /и :в качестве разделителей (без необходимости сначала переводить их в пробел ), преобразует название месяца в число, изменяет порядок по мере необходимости и подается толькоmktime()(gawk ). Вместо OFS (, который по умолчанию состоит из одного пробела и не был изменен ), вы можете использовать литерал " ", но я нахожу это более уродливым.

Пятая и шестая строки находят первое появление любого IPaddr и запоминают его отметку времени, а также пятое появление того же IPaddr и сравнивают его отметку времени с запомненной, чтобы увидеть если интервал меньше 15 секунд. Некоторые люди помещали ;nextв действие на пятой строке, чтобы было ясно, что пятая и шестая строки скрипта не будут выполняться для одной и той же записи (, то есть строки данных ), но я не беспокоился.

КЭФ.

Если вы предпочитаете, вы можете поместить весь сценарий в командную строку в '...'вместо использования файла сценария, но я не люблю делать это для более чем 100 символов.

3
18.03.2021, 22:53

Вместо того, чтобы просто смотреть на 1-е и 5-е вхождения второго поля, вы можете просмотреть все вхождения, разделенные пятью. Метод скользящего окна:

awk '
{
    n = c[$7] = ++c[$7] % 4
    m = index("..JanFebMarAprMayJunJulAugSepOctNovDec",$2)/3
    s = mktime($3 " " m " " $1 " " $4 " " $5 " " $6)
    if (s - t[$7,n] < 15 && !seen[$7]++) {
        print
    }
    t[$7,n] = s
}
' FS='[/:|]' output.csv
1
18.03.2021, 22:53

Это может быть немного чересчур, но, учитывая, что csv не является последовательным во времени, может возникнуть необходимость разобраться с этим, и, поскольку вы изучаете gawk, здесь может быть несколько вещей, которые нужно растянуть. ты...

awk -F'[|/:]' 'BEGIN{mth="   JanFebMarAprMayJunJulAugSepOctNovDec"}
        {mthn=int(index(mth,$2)/3)}
        {ipt=mktime($3" "mthn" "$1" "$4" "$5" "$6); ip[$7]++; print $7, ipt}' file | 
        sort | 
awk '{ix=(NR-1)%5; iy=(ix+1)%5; ip[ix]=$1;t[ix]=$2}
          NR>4&&(ip[ix]==ip[iy])&&((t[ix]-t[iy])<=15)&&(!found[$1]){print ip[ix]}'

прохождение

Установите разделитель полей -Fдля доступа к отдельным элементам поля даты и установите строку месяцев

awk -F'[|/:]' 'BEGIN{mth="   JanFebMarAprMayJunJulAugSepOctNovDec"}

Получить номер месяца как индекс совпадения в строке месяца / 3

        {mthn=int(index(mth,$2)/3);

Объединить поля даты в спецификацию времени для mktimeи преобразовать в отметку времени iptи вывести IP-адрес и отметку времени

            ipt=mktime($3" "mthn" "$1" "$4" "$5" "$6); print $7, ipt}' file |

Сортировка вывода

        sort |

сортирует по IP, а затем по времени. Вывод выглядит следующим образом

000.111.026.111 1603949440
000.111.026.111 1603949444
000.111.026.111 1603949445
000.111.026.111 1603949447
000.111.026.111 1603949448
000.111.026.111 1603950114
060.121.125.144 1603950112
060.121.125.144 1603950112
060.121.125.144 1603950115
060.121.125.144 1603950117
060.121.125.144 1603950118
111.111.111.111 1603946502
220.171.008.221 1603949447
221.651.943.323 1603946509

Затем верните его в awkи загрузите поля в массивы, содержащие отметку ipи timstamp, где индекс рассчитывается как (NR-1)%5, так что он вращается в диапазоне 0 -4 по мере того, как мы работать через файл. iy — пятая предыдущая запись (ix+1)%5, обернутая таким же образом

awk '{ix=(NR-1)%5; iy=(ix+1)%5; ip[ix]=$1;t[ix]=$2}

Затем самое интересное, если запись пятая или выше...

          NR>4

И ip в текущем поле такой же, как и в 5 полях до...

              &&(ip[ix]==ip[iy])

И разница во времени между этими полями <=15 секунд...

                &&((t[ix]-t[iy])<=15)

И мы раньше не сообщали об этом ip...

                  &&(!found[$1])

ТОГДА увеличивайте наш найденный счетчик, чтобы мы не сообщали об этом снова и сообщали об IP-адресе один раз

                    {found[$1]++; print $1}'
1
18.03.2021, 22:53
#!/bin/bash
awk -v mon=$(locale abmon) -v FS='[/:|]' '
BEGIN           {for(n=split(mon, M, ";"); n; n--) Mn[M[n]]=n}
!A[$7]++        {IP[$7] = mktime($3" "Mn[$2]" "$1" "$4" "$5" "$6)}
A[$7]==5 && mktime($3" "Mn[$2]" "$1" "$4" "$5" "$6) - IP[$7] < 15 {print $7}
' file > bot_ip

-v mon=$(locale abmon)-Переменной monназначается следующая строка:Jan;Feb;Mar;Apr;May;Jun;Jul;Aug;Sep;Oct;Nov;Dec
for(n=split(mon, M, ";"); n; n--)-Функция splitвозвращает количество элементов массива, которыми мы инициируем счетчик в цикле for

1
18.03.2021, 22:53

Теги

Похожие вопросы