代码抄于scapy,使用方法见Example,

使用with创建power shell对象,调run方法即可。

import os

from glob import glob

import subprocess as sp

class PowerShell:

# from scapy

def __init__(self, coding, ):

cmd = [self._where('PowerShell.exe'),

"-NoLogo", "-NonInteractive", # Do not print headers

"-Command", "-"] # Listen commands from stdin

startupinfo = sp.STARTUPINFO()

startupinfo.dwFlags |= sp.STARTF_USESHOWWINDOW

self.popen = sp.Popen(cmd, stdout=sp.PIPE, stdin=sp.PIPE, stderr=sp.STDOUT, startupinfo=startupinfo)

self.coding = coding

def __enter__(self):

return self

def __exit__(self, a, b, c):

self.popen.kill()

def run(self, cmd, timeout=15):

b_cmd = cmd.encode(encoding=self.coding)

try:

b_outs, errs = self.popen.communicate(b_cmd, timeout=timeout)

except sp.TimeoutExpired:

self.popen.kill()

b_outs, errs = self.popen.communicate()

outs = b_outs.decode(encoding=self.coding)

return outs, errs

@staticmethod

def _where(filename, dirs=None, env="PATH"):

"""Find file in current dir, in deep_lookup cache or in system path"""

if dirs is None:

dirs = []

if not isinstance(dirs, list):

dirs = [dirs]

if glob(filename):

return filename

paths = [os.curdir] + os.environ[env].split(os.path.pathsep) + dirs

try:

return next(os.path.normpath(match)

for path in paths

for match in glob(os.path.join(path, filename))

if match)

except (StopIteration, RuntimeError):

raise IOError("File not found: %s" % filename)

if __name__ == '__main__':

# Example:

with PowerShell('GBK') as ps:

outs, errs = ps.run('ping 127.0.0.1')

print('error:', os.linesep, errs)

print('output:', os.linesep, outs)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐