问题描述
我必须在我的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 8000
和nc --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
。