Найти - Пользователи
Полная версия: Сохранения команды ping в файл.
Начало » Python для новичков » Сохранения команды ping в файл.
1 2
denveren0k
Дорого времени суток уважаемые форумчане.
Подскажите как сделать что бы вывод команды ping не стирал предыдущие записи а добавлял.
Требуется пинговать устройства в сети с записью результатов в файл, для последующей выборки и определение то какое будет недоступно и качество прохождение пинга. Вот начало набросал, а как сделать что бы данные не перезаписывали незнаю. Может подскажите как другим путем это можно реализовать?

inde = ('192.168.1.1','192.168.1.2','192.168.1.3')
for y in inde:
	cmd = 'ping ' +y
	import subprocess
	PIPE = subprocess.PIPE
	p = subprocess.Popen(cmd, shell = True, stdout=open('ping.log','a'), cwd = 'c:/python/')
	p.wait()
	print cmd
Как можно реализовать более быстрый опрос устройств в сети если к примеру у нас не 3 устройства а 150. Fping и arp -a не подходят, запускаться будет на Windos2003, Fping он не тянет а arp -a не опрашивает что как раз и требуется, а тянет данные с таблицы.
Заранее спасибо за ответы.
denveren0k
Проблему с записью решил, может кому пригодится.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import codecs, sys
import subprocess
inde = ('192.168.1.1','192.168.1.2','192.168.1.3')
f = open('C:\\python\workfile.txt', 'a')
for y in inde:
    cmd = 'ping ' +y
    p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
    out = p.stdout.read() #в переменной out находится вывод команды ping.
    f.write(out)
f.closed
Насчет альтернативы ping-у вопрос остается открытым, поделитесь идеями.

Soteric
С помощью многопоточности. Устройства нужно опрашивать параллельно.
denveren0k
Вот пример вывода данных в файл.

Обмен пакетами с 192.168.1.1 по с 32 байтами данных:
Ответ от 192.168.1.1: число байт=32 время=6мс TTL=64
Ответ от 192.168.1.1: число байт=32 время=1мс TTL=64
Ответ от 192.168.1.1: число байт=32 время<1мс TTL=64
Ответ от 192.168.1.1: число байт=32 время=2мс TTL=64

Статистика Ping для 192.168.1.1:
Пакетов: отправлено = 4, получено = 4, потеряно = 0
(0% потерь)
Приблизительное время приема-передачи в мс:
Минимальное = 0мсек, Максимальное = 6 мсек, Среднее = 2 мсек

Обмен пакетами с 192.168.1.2 по с 32 байтами данных:
Ответ от 192.168.1.2: Заданный узел недоступен.
Ответ от 192.168.1.2: Заданный узел недоступен.
Ответ от 192.168.1.2: Заданный узел недоступен.
Ответ от 192.168.1.2: Заданный узел недоступен.

Статистика Ping для 192.168.1.2:
Пакетов: отправлено = 4, получено = 4, потеряно = 0
(0% потерь)

Обмен пакетами с 192.168.1.190 по с 32 байтами данных:
Ответ от 192.168.1.190: Заданный узел недоступен.
Ответ от 192.168.1.190: Заданный узел недоступен.
Ответ от 192.168.1.190: Заданный узел недоступен.
Ответ от 192.168.1.190: Заданный узел недоступен.

Статистика Ping для 192.168.1.190:
Пакетов: отправлено = 4, получено = 4, потеряно = 0
(0% потерь)

как сделать отображение рабочиx ip-адресов и выборкой их приема-передачи в мс?
например для 192.168.1.1
Статистика Ping для 192.168.1.2 (2 мсек)
гуглил этот вопрос ничего адекватного с поиском и выборкой из файла не нашел.
Помогите пожалуйста, может у кого были наработки?

py.user.next
denveren0k
как сделать отображение рабочиx ip-адресов и выборкой их приема-передачи в мс?
вообще, нужно разделить записи и анализировать каждую (чтобы случайно что-нибудь не то не попало не туда)

запись начинается с фразы “Обмен пакетами”
запись содержит какие-то строки, пустую строку, какие-то строки

вот сначала прочитай все записи по очереди и выведи их
denveren0k
Спасибо за совет, способ я в принципе нашел вот.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

open_file = open('C:\\python\workfile.txt', ‘r’)
line = open_file.readline()
for line in open_file:
#print line.find('192.168.1.111')
print line.startswith('Ответ')
#тут будет обработка
open_file.close()

С помощью line.startswith('Ответ') буду обрабатывать строки и сохранять построчную позицию, а потом уже делать выборку.
Тут проблема уже в другом пол дня вчера просидел так и не смог разобраться с кодировкой.
Дело в том что, как я понимаю скрип который сохраняет результат пинга в текстовый файл сохраняет его в ASCII, а с помощью обрабатывающего скрипта не получается его нормально обработать с русскими словами, что я только вчера не делал, гуглил пытался применить декодировать построчно ничего не получается.
Может кто знает как его можно обработать нормально, подскажите пожалуйста?
reclosedev
denveren0k
Насчет альтернативы ping-у вопрос остается открытым, поделитесь идеями.
Есть ping написанный на Питоне.
http://stackoverflow.com/a/317206/1052325

denveren0k
в текстовый файл сохраняет его в ASCII
cp866
denveren0k
Спасибо за ссылку почитаю, а вот насчет кодировки не понятно, как сделать сохранение результатов пинга в utf-8?
o7412369815963
Это можно без питона сделать, я на линухе делал по простому, вешал в крон “запуск каждые 5 мин”:
echo $(date +%Y-%m-%d_%H:%M) $(ping google.com -c 300 | grep -c 'time=') >> stat.csv
Потом открывал в excel и строил красивый график “косяков сети”.

Можете попробовать что-то подобное под виндой.
denveren0k
o7412369815963 Спасибо, но вот нужно именно в питоне, потому что будет дальнейшая обработка.
Пытаюсь обработать файл построчно с преобразованием line.encode('utf-8') но выдает ошибку
exceptions.UnicodeDecodeError: ‘ascii’ codec can't decode byte 0x8e in position 0: ordinal not in range(128) не хочет преобразовывать ни в какую кодировку.

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB