Как работает работа с трубами оболочки с подпроцессом? - PullRequest
0 голосов
/ 12 июня 2019

Я хотел бы получить тот же вывод, что и этот код оболочки:

$ ping -c 1 192.168.1.18  | egrep "bytes from" | cut -d " " -f4
192.168.1.18:

Этот шеллкод будет пинговать 1 раз 192.168.1.10. Затем будет отображена строка, содержащая «байты из». Наконец, он выберет 4-й столбец на основе разделителя "" (который является пробелом). 4-й столбец - это просто IP-адрес.

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

Вот мой код Python:

#!/usr/bin/python

import subprocess

ps1 = subprocess.Popen(('ping','-c','1','10.11.1.220'), stdout=subprocess.PIPE)
ps2 = subprocess.Popen(('egrep', '-i', 'bytes from'), stdin=ps1.stdout, stdout=subprocess.PIPE)
subprocess.call(['cut', '-d', '" "','-f','4'], stdin=ps2.stdout)

Итак, вот результат, который я получаю с этим кодом:

$ py ping-sweep.py 
cut: the delimiter must be a single character
Try 'cut --help' for more information.
$ grep: write error: Broken pipe

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

Доказательство:

ps1 = subprocess.Popen(('ping','-c','1','10.11.1.220'), stdout=subprocess.PIPE)
subprocess.call(['egrep', '-i', 'bytes from'], stdin=ps1.stdout)

Результат вывода:

$ py ping-sweep.py 
64 bytes from 10.11.1.220: icmp_seq=1 ttl=128 time=114 ms

Может ли помочь мне уйти от этого кошмара?

Спасибо!

Steackfrite

Ответы [ 2 ]

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

" " - синтаксис оболочки для строки с одним пробелом. Поскольку вы больше не используете оболочку, вы должны использовать эквивалент Python ' ':

subprocess.call(['cut', '-d', ' ', '-f', '4'], stdin=ps2.stdout)

'" "' - это строка из трех символов, поэтому cut жалуется на несколько разделителей.

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

Есть предыдущие ответы на эту тему, вам, скорее всего, нужно уйти как "с \"

...