如果我通过Popen调用NCat,为什么会立即超控?

问题描述

我必须在我的python3-script中使用NCat stdin-pipe,我决定为此subprocess.Popen使用。但是即使我这样称呼,NCat也会立即以错误代码2覆盖并写道:Ncat: You must specify a host to connect to. QUITTING.。我的代码

import subsubprocess
a = subprocess.Popen(['nc','--keep-open','--listen','8000'],stdin = subprocess.PIPE,shell = True)
...

我试图将localhost设置为倒数第二个参数:

a = subprocess.Popen(['nc','localhost',shell = True)

但是它给出了一个结果。在控制台中,nc --keep-open --listen 8000nc --keep-open --listen localhost 8000完美地工作。我该怎么办?

解决方法

我敢肯定,这里的问题是我最近遇到的。当传递参数列表并指定Popen时,shell = True并没有达到您的期望。当它们互斥使用时,这是最幸福的。所以代替:

a = subprocess.Popen(['nc','--keep-open','--listen','8000'],stdin = subprocess.PIPE,shell = True)

我会做:

a = subprocess.Popen(['nc',stdin = subprocess.PIPE)

或:

a = subprocess.Popen(['nc --keep-open --listen 8000'],shell = True)

我对文档进行了一些细致的研究,发现了一些有趣的花絮,这些花絮证实了我一直以来对自己的直觉很满意:

如果shell为True,建议将args作为字符串而不是序列传递。

在shell = True的POSIX上,shell默认为/ bin / sh。 ...如果参数 是一个序列,第一项指定命令字符串,任何 其他项目将被视为 外壳本身

因此,我想您的情况将多余的参数提供给/bin/sh而不是nc