Как передать несколько команд cmd.exe, инициированных на удаленном компьютере с помощью psexec

Я пытаюсь подключиться к удаленному компьютеру с помощью psexec и выполнить cmd.exe. После того, как я открою этот сеанс, я хочу запустить несколько команд, таких как mkdir, del и т. Д. Я столкнулся с проблемой, что я могу запустить только одну команду с подпроцессом, поскольку связь закрывает канал. Есть ли способ выполнить?

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: Как отладить и такой сценарий?


person Hemant    schedule 20.11.2013    source источник
comment
Что делает command = 'dir\r\n'? Возможно, вам нужна новая строка.   -  person User    schedule 20.11.2013
comment
я тоже так пробовал не получилось   -  person Hemant    schedule 20.11.2013
comment
работает ли команда, когда вы сами находитесь в cmd? Может быть, сетевая задержка имеет значение?   -  person User    schedule 20.11.2013
comment
@user, если вы спрашиваете, работает ли программа, когда я запускаю команду с помощью cmd.exe, то ответ - да. он отлично работает. для задержки n/w я не уверен, как ее отладить или узнать, что это актуально   -  person Hemant    schedule 20.11.2013
comment
Это потребует что-то вроде time.sleep(5) перед self.session.stdin.write(command).   -  person User    schedule 20.11.2013
comment
Я пробовал это, и я получаю [Errno 22] Неверный аргумент   -  person Hemant    schedule 20.11.2013


Ответы (1)


Локально сделал:

>>> 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. добавить Popen(..., shell=True)

  2. использовать список.

    [self.rpc_exec_path, '\\\\' + self.ip,  '-u', self.user,  '-p', self.password, 'cmd.exe']
    
person User    schedule 20.11.2013
comment
Я изменил popen, как вы просили, но я все еще не могу передать ввод - person Hemant; 20.11.2013