【问题标题】:Passing Arguments to subprocess.Popen in Python在 Python 中将参数传递给 subprocess.Popen
【发布时间】:2026-02-16 17:30:01
【问题描述】:

我有以下代码。它连接到 Service Now 实例。获取特定服务器的事件。该事件包含有关打印机创建的详细信息。 ip 在记录['user_input'] 中,打印机名称在记录['u_string_full_utf8_1'] 中。我想要实现的是将这些作为参数传递给 powershell,以便它可以运行 Printer Create 脚本。以下代码中传递的参数有效。但我不确定如何在其中传递参数。

import pysnow
import subprocess
import os

# Create client object
s = pysnow.Client(instance='instance', user='admin', password='password')

# Get all incidents
r = s.query('incident', query={'cmdb_ci':'a28cba7a4fb4030028f7fd218110c7f5'})

# order by 'created_on' descending, then iterate over the result and print out number
for record in r.get_multiple(order_by=['-created_on']):
    print(record['cmdb_ci'])

psxmlgen = subprocess.Popen([r'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe',
                            "Invoke-Command -ComputerName SERVER01 -FilePath 'C:\Users\testuser\Documents\Scripts\PrinterCreate.ps1' -ArgumentList '10.2.3.2','PS Driver for Universal Print','TESTPRINTER' -Credential $cred"], cwd=os.getcwd())
result = psxmlgen.wait()

我检查了现有资源,但无法弄清楚如何在中间传递它。

任何帮助将不胜感激。

使用Python2.7

【问题讨论】:

  • 您可能希望在 popen 的第二个参数中添加一个 'r' 前缀。
  • 让它工作。我同意应该有 r 但它没有它就可以工作,我认为如果没有坏就不要修复它。

标签: python python-2.7 arguments subprocess


【解决方案1】:

您可以参考两个类似的问题。 Popen 使您可以访问交互式过程的标准输入。你可以参考

Running an interactive command from within python

Running powershell script within python script, how to make python print the powershell output while it is running

两者都可能有所帮助。我不确定powershell是否将它的标准输入和标准输出公开为Windows中的普通本机进程。

【讨论】:

    【解决方案2】:

    让它与以下内容一起工作:

    psxmlgen = subprocess.Popen([r'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe',
                                "Invoke-Command -ComputerName Server01 -FilePath 'C:\Users\smehta30\Documents\Scripts\PrinterCreate.ps1' -ArgumentList "+record['user_input']+",'PS Driver for Universal Print',"+record['u_string_full_utf8_1']+" -Credential $cred"], cwd=os.getcwd())
    

    【讨论】:

    • 这行得通,但除非你相信你的输入,否则这很危险——record 中包含文字双引号的值可能会退出转义以执行注入攻击,从而提供任意的 powershell 代码。
    • (我可以告诉你如何在 bash 中避免同样的问题,但不幸的是,对于 PowerShell,我无能为力;也就是说,同样的问题显然存在于两个地方)。
    • (顺便说一句——父母的当前工作目录应该是孩子的默认工作目录;cwd= 真的改变了什么吗?)
    • 首先感谢您的编辑。我的错。我目前正在制作一个原型来显示 Servicenow 自动打印机创建查询。它处于非常早期的阶段。我需要学习如何避免注射。您能否提供 Bash 代码。也许我可以通过这里实现一些东西。嗯,必须在请求创建结束时限制输入。会调查的。
    • 所以,在 bash 中,您可以写成 subprocess.Popen(['sh', '-c', 'code using "$1" and "$2"', '_', record['user_input'], record['u_string_full_utf8_1']) -- 这样这些值就会从代码带外传递到 shell 解释器并在以后替换。