Я хотел бы обработать вывод из запроса подпроцесса и распечатать только конкретные детали. Теперь я первоначально спускался по маршруту PIPE
и прокладывал вывод на другой subprocess
grep
, но это казалось слишком ограниченным, то есть я мог печатать только несколько строк (некоторые из которых мне не нужны), используя -A
или -B
grep
аргументы. Итак, теперь я беру маршрут stdout.readline
. Мой вопрос: есть ли лучший способ добиться того, что я пытаюсь сделать? Является ли соответствие шаблону регулярным выражениям и re
лучшим вариантом?Обработка выходных данных из подпроцесса
Ниже приведен код для обоих путей мысли, чтобы дать некоторый контекст.
PIPE другого подпроцесс:
def nmap_ips(ip_list):
for ip in ip_list:
cmd1 = subprocess.Popen(["nmap", "-sC", "--open", "-Pn", "-p80,443", ip], stderr=subprocess.STDOUT, stdout=subprocess.PIPE)
cmd2 = subprocess.Popen(["grep", "title", "-A", "1"], stdin=cmd1.stdout)
cmd1.stdout.close()
output = cmd2.communicate()[0]
стандартный вывод читать строки: #Im не на самом деле получить выход из этой функции в данный момент, я предполагаю, что это мое регулярное выражение
def nmap_ips(ip_list):
regs = ["title", "commonName"]
combined = "|".join(regs)
for ip in ip_list:
p = subprocess.Popen(["nmap", "-sC", "--open", "-Pn", "-p80,443", ip], stderr=subprocess.STDOUT, stdout=subprocess.PIPE)
for line in iter(p.stdout.readline, b''):
ml = re.match(combined, line)
if ml:
print ml.group()
Пример данных, которые я пытаюсь манипулировать
Starting Nmap 6.40 (http://nmap.org) at 2014-10-10 23:47 BST
Nmap scan report for BTHomeHub.home (192.168.1.254)
Host is up (0.0054s latency).
PORT STATE SERVICE
80/tcp open http
| http-title: Home Hub Manager - Please Reset Your Password
|_Requested resource was http://BTHomeHub.home/html/home/a_firstlogin_configuration.html
443/tcp open https
| ssl-cert: Subject: commonName=bthomehub.home/countryName=UK
| Not valid before: 2011-01-15T16:52:23+00:00
|_Not valid after: 2024-01-17T16:52:23+00:00
|_ssl-date: 2014-10-10T22:47:18+00:00; +14s from local time.
В чем вопрос? Вы видите требуемый вывод, если используете 'print line,'? Вам нужно отлаживать регулярное выражение? Затем удалите несвязанный код подпроцесса и просто укажите несколько строк как строки в самом коде как тестовый ввод. – jfs
Извинения, похоже, я недостаточно прояснил ситуацию. Прежде всего, я прошу рекомендации о том, как добиться того, что мне нужно. Является ли метод readline возможным? – iNoob
возможно для чего? Код читает строки 'b '\ n''-разделенные от объединенного stdout/stderr от nmap. Это то, что вам нужно? Каков ожидаемый результат? – jfs