为什么如果我通过 Popen 调用 Ncat 会立即结束?

我必须在我的 python3 脚本中使用 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', '--keep-open', '--listen', 'localhost', '8000'], stdin = subprocess.PIPE, shell = True)

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


茅侃侃
浏览 48回答 1
1回答

拉风的咖菲猫

我很确定,这里的问题是我最近遇到的。 Popen当您传递参数列表并指定 时,它不会执行您期望的操作shell = True。当这些的使用是相互排斥的时候是最快乐的。所以而不是:a = subprocess.Popen(['nc', '--keep-open', '--listen', '8000'], stdin = subprocess.PIPE, shell = True)我会这样做:a = subprocess.Popen(['nc', '--keep-open', '--listen', '8000'], stdin = subprocess.PIPE)或者:a = subprocess.Popen(['nc --keep-open --listen 8000'], stdin = subprocess.PIPE, shell = True)我对文档进行了一些深入研究,发现了一些有趣的花絮,这些花絮证实了我一直通过经验相信自己的直觉:如果 shell 为 True,建议将 args 作为字符串而不是序列传递。在 shell=True 的 POSIX 上,shell 默认为 /bin/sh。...如果 args 是一个序列,则第一项指定命令字符串,任何其他项将被视为shell 本身的附加参数。所以我想额外的论点是被提供给/bin/sh而不是nc在你的情况下。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python