【问题标题】:Why NCat overs immediately if I call it by Popen?如果我用 Popen 调用它,为什么 NCat 会立即结束?
【发布时间】:2020-10-27 23:14:22
【问题描述】:

我必须在我的 python3 脚本中使用 NCat 标准输入管道,我决定使用 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 8000nc --keep-open --listen localhost 8000 工作完美。我该怎么办?

【问题讨论】:

    标签: python subprocess pipe popen netcat


    【解决方案1】:

    我很确定,这里的问题是我最近遇到的问题。当您传递参数列表并指定 shell = True 时,Popen 不会按照您的预期进行。当它们的使用相互排斥时,这是最快乐的。所以而不是:

    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。 ...如果参数 是一个序列,第一项指定命令字符串,任何 附加项目将被视为附加参数 外壳本身

    所以我猜在你的情况下,额外的参数被提供给/bin/sh,而不是nc

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 2015-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-23
      • 2021-11-01
      • 2014-03-18
      相关资源
      最近更新 更多