如何用带input密码参数的Popen存储samba-tool命令执行结果?
问题解决:捕获samba-tool命令输出
问题根源
你的代码存在两个关键问题:
- 未给
Popen指定stdout=PIPE参数,导致命令输出直接打印到终端,communicate()无法捕获这部分内容,返回的输出值为None。 - 错误地将
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
相关产品推荐
相关产品推荐

