我必须在我的 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工作完美。我应该怎么办?
1 回答
拉风的咖菲猫
TA贡献1995条经验 获得超2个赞
我很确定,这里的问题是我最近遇到的。 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
在你的情况下。
添加回答
举报
0/150
提交
取消