2016-01-11 4 views
0

Я пытаюсь выполнить команду следующую subprocess.Popen() в Python 2,6чтения вывода из subprocess.Popen в питона

output = subprocess.Popen("psexec -accepteula \\machineName -u username -p password cmd.exe /C fsutil fsinfo drives", stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) 
print(output.communicate()) 

Но я получаю следующий результат с output.communicate()

('\r\n', '\r\nPsExec v2.11 - Execute processes remotely\r\nCopyright (C) 2001-2014 Mark Russinovich\r\nSysinternals - www.sysinternals.com\r\n\r\nConnecting to machineNameHere...\r\r\rStarting PSEXESVC service on machineNameHere...\r\r\rConnecting with PsExec service on machineNameHere...\r\r\rStarting cmd.exe on machineNameHere...\r\r\r\r\ncmd.exe exited on machineNameHere with error code 0.\r\n') 

Когда я запускаю ту же команду psexec из строки cmd в windows, я получаю правильный вывод.

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

**Drives: A:\ C:\ D:\** 
cmd.exe exited on machineNameHere with error code 0. 

Ищу выход ** Drives: A: \ C: \ D: ** даже при выполнении Psexec команды, используя subprocess.Popen(). Как я могу это сделать?


Теперь я сузил проблему, выполняя различные команды, такие как dir и echo «test». Проблема заключается в том, что Popen читает только первую строку в stdout, а не полный вывод. Любые предложения по устранению этого?

+0

Прочтите непосредственно из процесса stdout. – Rishav

+2

Возможно, обратная косая черта интерпретируется по-разному между двумя средами? Попробуйте использовать необработанную строку для команды Popen. –

+0

PsExec не будет передавать вам клиентский результат. Лучше использовать OpenSSH для запуска команд удаленно, хотя это немного больно для установки в Windows. Вы также можете запустить собственный JSON-сервер. – Muposat

ответ

1

(расширение на комментарий Джона Гордона по вопросу)


вы пытаетесь запустить эту команду через оболочку:
"psexec -accepteula \\machineName -u username -p password cmd.exe /C fsutil fsinfo drives"

Обратите внимание, что у вас есть два раза подряд в команде (\\machineName). Обратная косая черта оказывается escape-символом в строковых литералах (используется для удаления символов, которые в противном случае имеют особое значение). Поэтому \\machineName переводится на \machineName, прежде чем он будет передан в порожденный процесс.

здесь 2 способа справиться с этим:

1) PREPEND экранирующего символа (еще один знак) перед каждой обратной косой черты: "psexec -accepteula \\\\machineName"

2) добавить 'R' перед строкой буквальное, что делает это аа сырой строки, и не будет интерпретировать backlsashes, как эвакуационные символы: r"psexec -accepteula \\machineName"


Вот пример в питоне переводчике, который должен сделать это Клео р. Обратите внимание на вывод, который печатается:

>>> print("\\machineName") 
\machineName 
>>> print("\\\\machineName") 
\\machineName 
>>> print(r"\\machineName") 
\\machineName 
+0

Привет, Кори, я вижу, что проблема здесь не в обратном слэше, потому что я могу запустить команду на удаленной машине. Чтобы проверить, действительно ли это работает, я изменил команду, которая должна запускаться на удаленной машине, чтобы просто что-то повторить, и я возвращаю вывод. Только когда я пытаюсь запустить команду ** cmd.exe/C fsutil fsinfo drives **, то вывод не будет обрабатываться подпроцессом. –

Смежные вопросы