Как правильно получить результаты от subprocess.run ()? - PullRequest
0 голосов
/ 13 ноября 2018

Мне жаль снова спрашивать об этом, но я не смог найти способ устранить ложный позитив, который продолжает происходить.

Когда я получаю ответ «Адресат недоступен», он показывает все возвращенные пакеты и 0 потерянных пакетов ... поэтому он показывает SERVER UP вместо down.

как на земле богов я могу обойти это?

# Server up/down Script

# - Module Import section
import socket
import sys
import os
import subprocess

# - IP Address input request
hostname1 = input (" Please Enter IP Address: ")

# - Command to run ping request, but also hides ping info
response = subprocess.run(["ping", "-c", "1", hostname1], stdout=subprocess.PIPE)
response.returncode

#___ ORIGINAL CODE ___
#if (response == "Reply from", hostname1):
if response.returncode == 0:
    print ( 50 * "-")
    print ("[ **SERVER IS ALIVE** ]")
    print ( 50 * "-")
elif response.returncode == 0 and (str("Destination host unreachable.")):
    print( 50 * "-")
    print(hostname1, "[ **SERVER DOWN** ] ")
    print( 50 * "-")
else:
    print( 50 * "-")
    print(hostname1, "[ **SERVER DOWN** ] ")
    print( 50 * "-")

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018
# - Import section - below are the modules I will need to call for this script
import socket
import sys
import os
import subprocess
import ctypes
import ipaddress

# - User input request for IP or hostanme
hostname1 = input (" Please Enter IP Address: ")

ip_net = ipaddress.ip_network(hostname1)

# Configure subprocess to hide the console window
info = subprocess.STARTUPINFO()
info.dwFlags |= subprocess.STARTF_USESHOWWINDOW
info.wShowWindow = subprocess.SW_HIDE

output = subprocess.Popen(['ping', '-n', '1', '-w', '500', str(hostname1)], stdout=subprocess.PIPE, startupinfo=info).communicate()[0]

if "Destination host unreachable" in output.decode('utf-8'):
    print ( 50 * "-")
    print (ctypes.windll.user32.MessageBoxW(0, hostname1 +  " [ SERVER OFFLINE ] ", " *** SERVER STATUS - ALERT *** ", 0))
    print ( 50 * "-")
elif "Request timed out" in output.decode('utf-8'):
    print( 50 * "-")
    print(ctypes.windll.user32.MessageBoxW(0, hostname1 + " [ SERVER OFFLINE ] ", "*** SERVER STATUS - ALERT ***", 0))
    print( 50 * "-")
else:
    print( 50 * "-")
    print(ctypes.windll.user32.MessageBoxW(0, hostname1 + " *** SERVER ALIVE *** ", "** SERVER STATUS - ALERT **", 0))
    print( 50 * "-")


#------------------------------------------------------
0 голосов
/ 13 ноября 2018

Выражение (str("Destination host unreachable."), которое вы имеете в своем коде, всегда будет оценивать как True - истинность любой непустой строки.

Если вы хотите увидеть, есть ли конкретная строка в выводе stdout, созданном вызванным подпроцессом, вам нужно будет использовать выражение наподобие этого:

("Destination host unreachable." in response.stdout.decode("utf-8"))

послеresponse = subprocess.run(...) call.

Вот статья , описывающая, как использовать модуль subprocess (обратите внимание особенно на раздел Capturing Output .

...