пытается получить выходные данные и код возврата для команды "n c -vz <host><port>" с помощью подпроцесса. Открыть в Python3 - PullRequest
0 голосов
/ 06 марта 2020

В Python3 с использованием subprocess.Popen, я хотел бы захватить выходные данные и код возврата команды для этой команды "n c -z 192.168.25.14 22". Вот мой пример кода: #!/usr/bin/env python import urllib.request, urllib.error, urllib.parse import subprocess import time # set up null file for pipe messages nul_f = open('/dev/null', 'w') # try loop for clean breakout with cntl-C try: with open('/mnt/usbdrive/output/Urls.txt') as f: for line in f: data = line.split() commands = ['nc', '-vZ', data[1], data[0]] print(commands) try: ncdmp = subprocess.Popen(commands , stderr=subprocess.PIPE, stdout=subprocess.PIPE,) except OSError: print ("error: popen") exit(-1) # if the subprocess call failed, there's not much point in continuing ncdmp.wait() if ncdmp.returncode != 0: print(" os.wait:exit status != 0\n") else: print ("os.wait:", ncdmp.pid, ncdmp.returncode) print("STDERR is ", ncdmp.stderr) print("STDOUT is ", ncdmp.stdout) print("STDIN is ", ncdmp.stdin) except KeyboardInterrupt: print('Done', i) # clean up pipe stuff ncdmp.terminate() ncdmp.kill() nul_f.close()

и пример вывода:

* Команды: ['n c', '-vZ', '192.168.25.14', '22']

os.wait: состояние выхода! = 0

STDERR равно <_io.BufferedReader name = 12>

STDOUT равно <_io.BufferedReader name = 9 >

STDIN - это <_io.BufferedWriter name = 8> *

Я предполагаю, что в моем коде или логике есть ошибка c, но я не могу ее выяснить. Я использовал подобный код для других команд, таких как s sh и ls без проблем. Для этой команды "n c" я получаю один и тот же набор выводов / сообщений независимо от того, существует ли открытый адрес 22 по адресу хоста.

Спасибо ... RDK

1 Ответ

0 голосов
/ 18 марта 2020

ОК, поскольку я не получил никаких полезных ответов на этот вопрос, я изменил код с subprocess.Popen на subprocess.run, как показано ниже. Эта модификация работала для моих требований, так как ncdup.stderr содержал информацию, которую я искал.

      commands = shlex.split("nc -vz " + "-w 5 " + data[1] + " " + data[0])
      try:
        ncdmp = subprocess.run(commands , capture_output=True)
      except OSError:
          print ("error: popen")
        exit(-1) 
      err_line = str(ncdmp.stderr)
...