SQLite, Python3 - PullRequest
       0

SQLite, Python3

0 голосов
/ 01 марта 2020

У меня проблема с SQLite. У меня есть база данных, содержащая 5 таблиц.

Таблица 1: сканы Столбцы: scan_id и scandate

Таблица 2: системы Столбцы: system_id, ip, dns ..

Таблица 3 : порты Столбцы: port_id, протокол, порт, сервис

Таблица 4: столбцы плагинов: plugin_id, PluginName, описание

Таблица 5: карты Столбцы: map_id, scan_id, system_id, port_id, plugin_id

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

`system_IP, protocol, port, service and all plugins identified on that systems port` 

В данный момент я застрял в этой команде:

`SELECT system_IP, protocol, port, service, PluginName FROM maps
 INNER JOIN scans ON (maps.scan_id = scans.scan_id)
 INNER JOIN systems ON (maps.system_id = systems.system_id)
 INNER JOIN ports ON (maps.ports_id = ports.ports_id)
 INNER JOIN plugins ON (maps.plugin_id = plugins.plugin_id)
 WHERE scan_id=1`

результат равен:

`123.456.789.1, TCP, 22, SSH, Plugin1
 123.456.789.1, TCP, 80, HTTP, Plugin2
 123.456.789.1, TCP, 80, HTTP, Plugin3`

Я хотел бы получить следующее:

`123.456.789.1, TCP, 22, SSH, Plugin1
 123.456.789.1, TCP, 80, HTTP, Plugin2, Plugin3, Plugin4
 123.456.789.1, TCP, 443, SSH, Plugin3`

Как мне это сделать?

РЕДАКТИРОВАТЬ: Пример данных:

Table 1: scans
scan_id     |    scan_date
1                2.2020
2                3.2020

Table 2: systems
system_id   |    ip           |   dns
1             123.456.789.1     one.dns.com
2             123.456.789.2     two.dns.com

Table 3: ports
port_id     |   protocol      |   port    |  service
1               tcp               22         ssh
2               udp               161        smtp
3               tcp               80         http

Table 4: plugins
plugin_id    |  pluginname     |  plugindescription
1                1234567890       Beschreibung1
2                2345678901       Beschreibung2

Table 5: maps
maps_id      |  system_id      |   port_id   |   plugin_id | scan_id
1                  1                  1              1          1
2                  1                  3              1          1
3                  1                  3              2          1
4                  1                  3              3          1
5                  2                  2              1          1
6                  2                  2              2          1
7                  2                  2              3          1
8                  1                  1              1          2
...

Надеюсь, это поможет прояснить ситуацию.

Ответы [ 2 ]

0 голосов
/ 01 марта 2020

Я думаю, что вы хотите GROUP_CONCAT():

SELECT systems.system_Id, ports.protocol, ports.port, ports.service, 
  GROUP_CONCAT(plugins.PluginName) pluginnames,
  GROUP_CONCAT(plugins.plugindescription) plugindescriptions
FROM maps
INNER JOIN scans ON (maps.scan_id = scans.scan_id)
INNER JOIN systems ON (maps.system_id = systems.system_id)
INNER JOIN ports ON (maps.port_id = ports.port_id)
INNER JOIN plugins ON (maps.plugin_id = plugins.plugin_id)
WHERE scans.scan_id=1
GROUP BY systems.system_Id, ports.protocol, ports.port, ports.service
0 голосов
/ 01 марта 2020

Теперь я хотел бы получить следующее: за последний день сканирования

Это предполагает что-то вроде:

SELECT system_IP, protocol, p.port, service, pl.PluginName
FROM (SELECT s.*
      FROM scans s
      ORDER BY scandate DESC
      LIMIT 1
     ) s JOIN
     maps m
     ON m.scan_id = s.scan_id JOIN
     systems sy
     ON m.system_id = sy.system_id JOIN
     ports p
     ON m.ports_id = p.ports_id JOIN
     plugins pl
     ON m.plugin_id = pl.plugin_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...