1

psexec を使用してリモート マシンに接続し、cmd.exe を実行しようとしています。このセッションを開いた後、mkdir、del などの複数のコマンドを実行したいと思います。パイプを閉じて通信するときに、サブプロセスで 1 つのコマンドしか実行できないという問題に直面しています。達成する方法はありますか?

from subprocess import Popen, PIPE, STDOUT

class WsRPC():
    def __init__(self):
        self.rpc_exec_path = r'C:\SysinternalsSuite\psexec.exe'
        self.user = 'administrator'
        self.ip = '172.xxx.xxx.xxx'
        self.password = 'XxXxXxXx'
        self.session = ''

    def wsConnect(self):
        pass
    def runCommand(self):
        try:             

            self.session = Popen([self.rpc_exec_path, '\\\\' + self.ip,  '-u',
                                 self.user,  '-p', self.password, 'cmd.exe'],
                                 stdin = PIPE,stdout = PIPE,stderr = PIPE,
                                 shell = True)
            command = 'cmd.exe /c dir'
            self.session.stdin.write('dir/r/n')
            strout, strerr = self.session.communicate()
            print strout
            print strerr
        except Exception,e:
            print str(e)

obj = WsRPC()
obj.runCommand()

このコードを実行すると、次の o/p が表示されます -

C:\SysinternalsSuite\psexec.exe \\172.xxx.xxx.xxx -u administrator 
-p XxXxXxXx cmd.exe
Microsoft Windows [Version 5.2.3790]


PsExec v2.0 - Execute processes remotely
Copyright (C) 2001-2013 Mark Russinovich
Sysinternals - www.sysinternals.com

Connecting to 172.xxx.xxx.xxx...


Starting PSEXESVC service on 172.xxx.xxx.xxx...


Connecting with PsExec service on 172.xxx.xxx.xxx...


Starting cmd.exe on 172.xxx.xxx.xxx...



cmd.exe exited on 172.xxx.xxx.xxx with error code 0.

私の「ディレクトリ」が機能していないようです。

PS: この種のシナリオもデバッグする方法は?

4

1 に答える 1

0

ローカルで私はしました:

>>> import subprocess
>>> s = subprocess.Popen(['cmd.exe'], stderr = subprocess.PIPE, stdin = subprocess.PIPE, stdout = subprocess.PIPE, )
>>> s.stdin.write('dir\r\n') # letting out '\r\n' does not run the command
>>> s.communicate()

あなたへの私の質問は次のとおりです。psexec で同じことを行った場合、それでも機能しますか?

connection_stringリストの代わりに文字列を使用すると、問題が発生する可能性があります。試す:

  1. add Popen(..., shell=True)

  2. リストを使用します。

    [self.rpc_exec_path, '\\\\' + self.ip,  '-u', self.user,  '-p', self.password, 'cmd.exe']
    
于 2013-11-20T10:52:00.113 に答える