【问题标题】:How multiples shell pipes with subprocess work?带有子进程的多个壳管如何工作?
【发布时间】:2019-06-12 15:37:45
【问题描述】:

我希望得到与此 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 包含“来自的字节”的行。 最后,它将根据分隔符“”(一个空格)选择第 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

能帮我摆脱这个噩梦吗?

谢谢!

炸薯条

【问题讨论】:

    标签: python-2.7 shell subprocess pipe


    【解决方案1】:

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

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

    '" "' 是一个由三个字符组成的字符串,这就是为什么cut 抱怨多个分隔符。

    【讨论】:

      【解决方案2】:

      有关于该主题的先前答案,您很可能需要同时转义“与\”

      【讨论】:

        猜你喜欢
        • 2014-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-01
        • 2011-10-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多