@pepelac0

Как можно упростить код?

import requests
f = open('ip.txt','r')
f1 = open('white_list.txt','w')
ip_list = f.read().split('\n') # xxx.xxx.xxx.xxx-xxx.xxx.xxx.xxx
for ip in ip_list:
	ip1, ip2 = ip.split('-')
	ip0 = ".".join(ip1.split('.')[:3]) + '.'
	print(ip2)
	num1 = int(ip1.split('.')[-1])
	num2 = int(ip2.split('.')[-1]) + 1
	for i in range(num1, num2):
		try:
			r = requests.get('http://' + ip0 + str(i) + ':8000', timeout=2)
			print('http://' + ip0 + str(i) + ':8000')
			f1.write('http://' + ip0 + str(i) + ':8000\n')
		except:
			continue
f.close()
f1.close()


Код прост. Подаются данные списки ip - адресов . xxx.xxx.xxx.10 - xxx.xxx.xxx.50
И нужно просто проверять, можно ли зайти на xxx.xxx.xxx.xxx:8000.
Нужно ли заменять requests на сокеты? Многопоточность? Как парсить значение 10 и 50 у строк? Есть более легкий выход?
  • Вопрос задан
  • 175 просмотров
Пригласить эксперта
Ответы на вопрос 3
igorzakhar
@igorzakhar
Набросал на коленке:
https://gist.github.com/igorzakhar/bbd054c1f1290dd...
Или:
Пример кода с использованием aiohttp
import asyncio
import re

import aiohttp


def load_ip_list(filename):
    with open(filename, 'r') as fp:
        ip_list = fp.read().rstrip().split('\n')
        return ip_list


def save_file(filename, responses):
    with open(filename, 'w') as fp:
        for response in responses:
            if response:
                url, status = response
                save_line = "{:28} {}\n".format(url, status)
                fp.write(save_line)


def get_ipaddresses_range(ip_list):
    ip_addresses_range = []
    for ip_addr in ip_list:
        pattern = r'([\d\.]+\.)(\d+)-[\d\.]+\.(\d+)$'
        network, host_min, host_max = re.search(pattern, ip_addr).groups()
        ip_range = [
            network + str(host)
            for host in range(int(host_min), int(host_max) + 1)
        ]
        ip_addresses_range.extend(ip_range)
    return ip_addresses_range


def create_urls_list(ip_addr_range):
    url_scheme = 'http'
    port = '8000'
    url_pattern = "{}://{}:{}"
    urls = [
        url_pattern.format(url_scheme, ip, port)
        for ip in ip_addr_range
    ]
    return urls


async def get_response_status(url, session):
    try:
        async with session.head(url, timeout=2) as response:
            return url, response.status
    except asyncio.TimeoutError:
        pass


async def check_ip(urls_list, session):
    tasks = [
        asyncio.ensure_future(get_response_status(url, session))
        for url in urls_list
    ]
    responses = await asyncio.gather(*tasks)
    return responses


async def run(loop, urls_list):
    async with aiohttp.ClientSession(loop=loop) as session:
        results = await check_ip(urls_list, session)
    return results


if __name__ == '__main__':
    ip_list = load_ip_list('ip.txt')
    ip_range = get_ipaddresses_range(ip_list)
    urls = create_urls_list(ip_range)

    loop = asyncio.get_event_loop()
    results = loop.run_until_complete(run(loop, urls))
    save_file('white_list.txt', results)
    loop.close()

Ответ написан
Комментировать
@lega
Для "разбора" текста удобно использовать re (regex)
>>> re.search(r'([\d\.]+\.)(\d+)-[\d\.]+\.(\d+)$', '127.0.0.10-127.0.0.50').groups()
('127.0.0.', '10', '50')

Для "массивных" сетевых задач asyncio - можете отправить 10тыс запросов за раз, вместо проверки в цикле.
Ответ написан
Комментировать
@artinnok
бекенд-программист
если вы пытаетесь сделать свой сканер портов - советую посмотреть в сторону nmap
если хочется чего-то покруче для пентеста - kali

если хотите писать хорошо на питоне - почитайте

из личных ощущений:
  • код очень сложный для простой задачи
  • не сможете разобраться в данном коде через 3-6 месяцев
  • socket в данной ситуации необязательно использовать, requests достаточно
  • на данном этапе многопоточность избыточна для этого кода
  • почитайте про нейминг переменных в питоне
  • try без явного указания ошибок в except не стоит использовать (данную конструкцию стоит использовать только в том случае, если вы реально знаете для чего она) - вы ловите все исключения и игнорируете их. сделайте обработку конкретных исключений, если они там возникают.
  • пишите менее "сжатый" код - добавляйте новые линии, они визуально делят код на логические блоки
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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