为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

茅侃侃 2024-01-12 10:39:44
我必须在我的 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在你的情况下。


查看完整回答
反对 回复 2024-01-12
  • 1 回答
  • 0 关注
  • 39 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信