带子进程的多个壳管如何工作?

时间:2019-06-12 15:37:45

标签: python-2.7 shell subprocess pipe

我想获得与此shell代码相同的输出:

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

此shellcode将ping 1次192.168.1.10。 然后它将grep包含“ bytes from”的行。 最后,它将基于定界符“”(空白)选择第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

能帮助我摆脱这场噩梦吗?

谢谢!

铁饼

2 个答案:

答案 0 :(得分:0)

关于该主题,以前有答案,您很可能需要用“ \”转义两个

答案 1 :(得分:0)

" "是带有单个空格的字符串的Shell语法。由于您不再运行Shell,因此应使用与Python等效的' '

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

'" "'是由三个字符组成的字符串,这就是cut抱怨多个分隔符的原因。