You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用带input密码参数的Popen存储samba-tool命令执行结果?

问题解决:捕获samba-tool命令输出

问题根源

你的代码存在两个关键问题:

  1. 未给Popen指定stdout=PIPE参数,导致命令输出直接打印到终端,communicate()无法捕获这部分内容,返回的输出值为None。
  2. 错误地将communicate()的返回值赋值给process变量,实际上process应该是Popen对象,后续再通过它调用communicate()获取输出。

修正后的代码

from subprocess import Popen, PIPE, STDOUT

def run_command():
    # 初始化Popen对象,指定捕获标准输出和错误输出
    proc = Popen(
        ['samba-tool', 'dns','query','chaps.xpto.local','xpto.local','@','ALL','-U','auditor'],
        stdin=PIPE,
        stdout=PIPE,
        stderr=STDOUT,  # 将错误输出合并到标准输出,统一捕获
        text=True       # 直接返回字符串类型输出,无需手动解码字节
    )
    # 传递密码并获取命令输出
    output, _ = proc.communicate(input='@!3202@otpX')
    
    # 打印捕获的输出和进程状态
    print("捕获的命令输出:")
    print(output)
    print("进程返回码:", proc.returncode)

run_command()

关键说明

  • stdout=PIPE:告诉Popen捕获命令的标准输出,而不是直接输出到终端。
  • stderr=STDOUT:将错误输出合并到标准输出中,方便一次性获取所有输出(如果需要分开捕获,可改为stderr=PIPE)。
  • text=True:让communicate()返回字符串而非字节,简化后续处理;如果需要字节数据,去掉该参数并使用input=b'@!3202@otpX'。
  • communicate()返回(stdout_data, stderr_data),当设置stderr=STDOUT时,stderr_data为None,所以用_占位。

内容的提问来源于stack exchange,提问作者Sergio de Oliveira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 20:50:30