LINUX.ORG.RU

Составление списков виртуалов

 ,


0

1

Нужно составить, список виртуалов. В базе есть отдельная таблица для этого, в одной из колонок хранится уникальное поле для идентификации пользователя, вроде IP, в другой ник. Остальные не важны.

Сейчас список первого вида получается примерно так:

#!/bin/bash

...

hash_list=$(s3query "$DB" "select ticket from bans" | sort | uniq)

for hash in $hash_list; do
  users=$(s3query "$DB" "select user from bans where ticket='$hash'" | sort | uniq)
  if [ "$(echo -e "$users" | wc -l)" -gt 1 ]; then
    echo "$hash: $(echo $users)"
  fi
done

Но оно будет отслеживать виртуалов только в пределах ticket, т.е. при ситуациях, когда в базе так:

user|ticket
--------------
user0|ticket1
user1|ticket1
user1|ticket2
user2|ticket2
Я получу вот такое, и разбираться мне, кто есть кто, придется вручную:
ticket1: user0 user1
ticket2: user1 user2
Хотелось бы получать вот такой список:
ticket1 ticket2: user0 user1 user2

★★★★★

Последнее исправление: derlafff (всего исправлений: 12)

ЯНИЧЕГОНЕПОНЯЛ.ЖПГ

Есть БД, есть таблица уникальное-поле:имя
Т.е. из файла

так где ты говоришь входящие данные?

Есть БД, есть таблица уникальное-поле:имя

libastral: наверное ты хотел сказать

Есть БД, есть таблица. уникальное поле — имя

но все равно ничего не ясно. дай сюда

select * from ${table_name} limit 1;

а куда и в каком формате нужны выходные данные?

PS: только баш и нини?

ZuBB ★★★★★
()
Последнее исправление: ZuBB (всего исправлений: 1)

Я тоже ННП. Но ты пойми уже что баш - это не язык программирования, писать на нём что-то больше однострочника себе дороже. Странно, я думал это то должно было дойти.

А вообще man GROUP BY и man DISTINCT наверно. Правда я не понял, как это: Уникальное поле, по совпадению которого надо выбирать виртуалов... Покажи стуктуру бд нормально.

Kalashnikov ★★★
()

Есть БД, есть таблица уникальное-поле:имя

Нужно составить, проще говоря, список виртуалов.

да, действительно. проще некуда.

nanoolinux ★★★★
()

обыкновенный поиск с сортировкой.Можешь даже нагуглить решение.

anonymous
()
Ответ на: комментарий от Kalashnikov

Но ты пойми уже что баш - это не язык программирования, писать на нём что-то больше однострочника себе дороже. Странно, я думал это то должно было дойти.

Если тебе так сложно представить это в баше, предложи, как это сделать в другом языке. Не так уж и сложно будет перенести, я думаю

Я тоже ННП.

Я не высыпаюсь. Поправил, попробуй еще раз прочитать топик

derlafff ★★★★★
() автор топика
Ответ на: комментарий от derlafff

Хотелось бы получать вот такой список:

ticket1 ticket2: user0 user1 user2

то что я вижу делается в два счета

левая сторона

select distinct ticket from ${table_name};
правая сторона
select distinct user from ${table_name};

я думаю что склеить ты можешь их и в баше

но мне вот кажется что это не то, что ты хочешь..

ZuBB ★★★★★
()
Ответ на: комментарий от derlafff

Весь кусок кода говнокод хотя бы потому что ты используешь СУБД только для того чтобы вытащить данные, а потом в строковом виде манипулировать ими(sic!) в баше. Вместо

s3query "$DB" "select ticket from bans" | sort | uniq
куда луше было бы
select distinct ticket from bans order by ticket asc;

уникальное поле для идентификации пользователя, вроде IP
в другой ник.
Остальные не важны.

A ticket - это какое? Судя по примеру оно не уникальное, тогда оно важное, или не важное?

В таблице есть поля user и ticket, нужно найти юзеров которые спались использование одного тикет, так? Одним SQL тут не обойтись скорее всего, да, но запрос можно упростить. Я пока такое родил:

select `ticket`, `user` from bans where `ticket` in (select `ticket` from bans group by `ticket` having count(*) >1);
Выдаёт
ticket1|user0
ticket1|user1
ticket2|user1
ticket2|user2
Тоже самое что и было, но 2 запроса вместо 100500 (можно и одним переписать с джойнами).

Расскажи, как эти данные потом используются. Что-то мне подсазывает что ты делаешь что-то не так раз тебе нужна такая странная структура в итоге.

Kalashnikov ★★★
()
Ответ на: немножко офтопа от ZuBB

как ты сумел редактировать тему на протяжении ~8 часов?

сам удивлен

derlafff ★★★★★
() автор топика
Ответ на: комментарий от Kalashnikov

Расскажи, как эти данные потом используются. Что-то мне подсазывает что ты делаешь что-то не так раз тебе нужна такая странная структура в итоге.

Пока только смотрю глазами. После виртуалы забаненных пользователей, что спалились по тикету будут автоматически баниться.

Остальное сейчас посмотрю, спасибо

derlafff ★★★★★
() автор топика
Последнее исправление: derlafff (всего исправлений: 1)
Ответ на: комментарий от Kalashnikov

В таблице есть поля user и ticket, нужно найти юзеров которые спались использование одного тикет, так? Одним SQL тут не обойтись скорее всего, да, но запрос можно упростить. Я пока такое родил:

Немного не то. Мне нужно получить в итоге список виртуалов, по которому я могу автоматически проходить банхаммером.

derlafff ★★★★★
() автор топика
Ответ на: комментарий от Kalashnikov

виртуал это тот, кто имеет аккаунт, связанный через тикеты с другим аккаунтом

ticket1|user1
ticket1|user2
ticket2|user2
ticket2|user3
ticket3|user3

user3 - виртуал user1, user2. При этом последние два виртуалы двух остальных из троицы.

Есть отдельная таблица users, которая имеет столбец banned.

Есть также рабочая реализация ban(), которая работает на любой вложенности, но она просто ужасна и слишком ресурсоемка.

ban() {

  local virtual
  local i_users
  local e_users
  local i_tickets
  local e_tickets
  local ticket_entry
  local add_users
  local reason

  i_users=$1
  e_users=''
  i_tickets=''
  e_tickets=''
  add_users=''
  reason=$(s3strip_quotes "$2")

  #пока нам есть, кого банить
  while [ -n "$i_users" ]; do

    #для каждого виртуала
    for virtual in $i_users; do
      #для начала его забаним
      ban_username "$virtual" "$1" "$reason" || return 93

      #добавим в наш список все его тикеты
      i_tickets="$i_tickets "$(s3query "$DB" "select ticket from bans where user='$virtual'")

      #и по каждому тикету найдем еще виртуалов
      for ticket_entry in $i_tickets; do
        if ! echo "$e_tickets" | grep -q -e "$ticket_entry"; then

          #добавляем новых виртуалов во временный список
          add_users="$add_users "$(s3query "$DB" "select user from bans where ticket='$ticket_entry'" | sort | uniq)

          #не забывая добавить тикет в использованные
          e_tickets="$e_tickets $ticket_entry"
        else
          true
        fi
      done
    done

    #а старых виртуалов добавляем в использованные
    e_users="$e_users $i_users"
    i_users=''

    #смотрим, есть ли в новом списке уже использованные
    for virtual in $add_users; do

      #если нет, добавляем
      if ! echo "$e_users" | grep -q -e "$virtual"; then
        i_users="$i_users $virtual"
      fi
    done

    add_users=''

  done

}
derlafff ★★★★★
() автор топика
Последнее исправление: derlafff (всего исправлений: 2)

уникальное поле для идентификации пользователя, вроде IP

уникальное

вроде IP

Напомнить, как в википедии забанили весь Катар?

buddhist ★★★★★
()
Ответ на: комментарий от derlafff

А, так тикеты не важны в итоге? Тогда типа проще. Тут циклы или процедуры нужны чтоб сделать бесконечный обход, но ни того, ни другого нет в скулайте. С N джойнами можно выловить виртуалов до Nй глубины, но это тупость. Или как-то так можно поймать всех виртуалов всех юзеров в одной куче:

select distinct b1.user from bans as b1, bans as b2 where (b1.ticket = b2.ticket and b1.user != b2.user);

Kalashnikov ★★★
()
Ответ на: комментарий от Kalashnikov

Вот такое, наверное, я и возьму на вооружение

select distinct b1.user from bans as b1, bans as b2 where (b2.banned = true and b1.ticket = b2.ticket and b1.user != b2.user);

Но тогда придется банить старым ужасным способом, ибо в глубину такое работать не будет

derlafff ★★★★★
() автор топика
Ответ на: комментарий от derlafff

Хотя нет, не вариант. Есть ситуации, в которых нужно обязательно идти в глубину.

derlafff ★★★★★
() автор топика
Ответ на: комментарий от derlafff

оно такого не допускает. там используется мак и еще кое-что

А что оно допускает? К примеру, схема, когда в Internet работает только один хост на несколько человек, а пользователи на нем/в его памяти запускают браузер и получают, грубо говоря, картинку по сети через X (в винде Xming или VNC). Т.е. весь контент остается только на этом хосте, а загрузки можно забрать по ftp. Логин у каждого свой, но некоторые умудрялись сидеть и под одним логином. Ты их всех увидишь как виртуалов?

anonymous
()
Ответ на: комментарий от anonymous

Представь, что ты админ ХОТЬ ЧЕГО. И короче обращается к тебе пользователь: «Это, мы тут короче с пацанами через один хост сидим через VNC. Вы нас всех сразу забанили, весь раён!». И что ты собираешься городить что-нибудь, чтобы определять, кто из них в сети?

power
()
Ответ на: комментарий от power

Представь себе, что ты админ. И, короче, обращается к тебе бизнес: «Хочу использовать терминальные сервера и не хочу форвардить интернет трафик во внутреннюю сеть никаким образом! Мне тут вирусы и локи на* не нужны!». И что ты собираешься городить что-нибудь?

anonymous
()
Ответ на: комментарий от anonymous

Я еще посмотрю на извращенцев, которые играют в minecraft через VNC-подобную фигню

derlafff ★★★★★
() автор топика
Последнее исправление: derlafff (всего исправлений: 1)
Ответ на: комментарий от Slavaz

хранимые процедуры в базе поддерживаются?

Нет, но я всё равно думал на mysql переходить, с ним это будет намного проще?

derlafff ★★★★★
() автор топика
Ответ на: комментарий от X10Dead

Не. Форум действительно пока мне не по силам, отрабатываю приемы на менее крупных вещах

derlafff ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.