使Python子进程在PowerShell中运行

问题描述 投票:0回答:3

我正在尝试在我的Android中获取ADB的无线调试端口,使用此处的命令

& "D:\Tools\Nmap\nmap.exe" -T4 192.168.2.20 -p 37000-44000 | Where-Object {$_ -match "tcp open"} | ForEach-Object {$_.split("/")[0]}

我想制作一个Python脚本用于进一步的目的:

ip = '192.168.2.20'
nmap_path = r'D:\Tools\Nmap\nmap.exe'


def get_port():
    port_result = subprocess.run(
        f'& "{nmap_path}" -T4 {ip} -p 37000-44000 | '
        f'Where-Object {{$_ -match "tcp open"}} | '
        f'ForEach-Object {{$_.split("/")[0]}}',
        shell=True
    )
    port = port_result.stdout.decode('utf-8').strip()
    return port

但是却给出了以下错误:

& was unexpected at this time.
,这表明该命令是在CMD而不是PowerShell中运行的。

我不想使用

powershell -Command
,也不想将命令保存到
.ps1
文件中。

我可以让

subprocess.run
专门在 PowerShell 中运行吗?

python powershell subprocess
3个回答
0
投票

文档

subprocess()
使用
COMSPEC
来确定如果您设置
shell=True
则运行哪个shell。

我没有、不想要或使用 Windows,但想象您需要类似的东西:

import os
import subprocess

# Change COMSPEC to point to Powershell
os.putenv('COMSPEC',r'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe')

subprocess.run(..., shell=True)

我假设你可以检查该路径。


我想保存并恢复以前的 COMSPEC 可能是一个很好的做法,以防 Powershell 的更改扰乱其他情况。所以:

# Save original COMSPEC
savedCOMSPEC = os.getenv('COMSPEC')

... CODE FROM ABOVE ...

# Restore previous COMSPEC
os.putenv('COMSPEC', savedCOMSPEC)

0
投票

选项1:

您可以通过在 powershell 中pip-installing nmap 来解决此问题,方法是以管理员身份运行 powershell 并运行:

pip install nmap
pip install python-nmap

然后,回到 python 脚本,使用 subprocess.call 调用 powershell,然后是 powershell.exe 的路径,然后是要执行的所需命令:

import subprocess
from subprocess import call

subprocess.call(f'C:\Windows\System32\powershell.exe nmap -T4 -p 37000-44000', shell=True)

选项2:

您可以将 nmap 作为包导入到您的 python 脚本中,仍然确保您 pip 安装了 nmap 和 python-nmap。 import nmap scan = nmap.PortScanner() scan.scan({ip}, '37000-44000')

我找到了一篇
详细的文章

解释了如何执行后一种方法。 (即将 nmap 作为包直接导入到您的脚本中。) 祝你好运,编码愉快! ;)


0
投票

from subprocess import run import os # Change COMSPEC to point to Powershell my_env = os.environ.copy() my_env['COMSPEC'] = r'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe' #run process arcgs = [<arguments>] p = run(args, shell=True, env = my_env)

© www.soinside.com 2019 - 2024. All rights reserved.