Python 3, Примите текстовый файл IP-адресов и Ping в порядке - PullRequest
1 голос
/ 30 июня 2019

Я работаю в Mac OS и могу сортировать текстовый файл, состоящий из нескольких IP-адресов, не в последовательном порядке.Я могу отсортировать адреса по порядку и распечатать их.

Я хотел бы также взять этот новый отсортированный список и пинговать адреса в том же порядке.

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

Код:

#!/usr/bin/env python3

import subprocess

with open("path to text file") as f:
    lines = f.readlines()

    for target in sorted(lines, key=lambda target:
    (int(target.split(".")[1]))):
        print(target)
    print('-' * 40)
    print('Attempting to ping IP Addresses in order... \n')

for line in target:

    try:
        ping = subprocess.Popen(
            ["ping", "-c", "1", "-l", "1", "-s", "1", "-W", "1", line],
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE
        )
    finally:
        reach, error = ping.communicate()
        print(reach)

Например,, если в текстовый файл включены следующие адреса:
10.4.1.1,
10.6.1.1,
10.8.1.1,
10.20.1.1

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

Ниже показано, что выводит скрипт:
10.4.1.1

10.6.1.1

10.8.1.1

10.20.1.1


Попытка пинговать IP-адреса по порядку ...

PING 1 (0.0.0.1): 1 байт данных \ n \ n --- 1 статистика пинга--- \ n1 переданных пакетов, 0 принятых пакетов, 100.0% потерь пакетов \ n '
b'PING 0 (0.0.0.0): 1 байт данных \ n \ n --- 0 пинговой статистики --- \ n1Переданные пакеты, 0 принятых пакетов, 100.0% потери пакетов \ n '
b' 'b'PING 2 (0.0.0.2): 1 байт данных \ n \ n --- 2 пинг-статистики --- \ n1 переданных пакетов, 0 полученных пакетов, потеря 100.0% пакетов \ n '
b'PING 0 (0.0.0.0): 1 байт данных \ n \ n --- 0 пинговой статистики --- \ n1 переданных пакетов, 0 принятых пакетов, 100.0% потерь пакетов \ n '
b' 'b'PING 1(0.0.0.1): 1 байт данных \ n \ n --- 1 статистика пинга --- \ n1 переданных пакетов, 0 полученных пакетов, потеря пакетов 100.0% \ n '
b' 'b'PING 1 (0.0.0.1): 1 байт данных \ n \ n --- 1 статистика пинга --- \ n1 переданных пакетов, 0 полученных пакетов, потеря пакетов 100,0% \ n '
b' '

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

1 Ответ

0 голосов
/ 30 июня 2019

Ошибка в строке for line in target:

Вы (повторно) используете переменную target, она содержит последний IP-адрес вашего отсортированного списка адресов. ("10.20.1.1").

Если вы перебираете строку с циклом for, вы получаете по одному символу за раз (["1", "0", "2", "0", "1", "1"]) - программа ping пытается преобразовать в отдельные символы IP-адреса и не может достичь их.

Попробуйте реструктурировать ваш скрипт следующим образом (непроверенный псевдокод):

with open(...) as f:
    lines = f.readlines()

addresses = sorted(lines, ...)

print('showing addresses:')

for address in addresses:
    print(address)


print('checking addresses:')

for address in addresses:
    subprocess.Popen(['ping', ..., address], ...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...