netshコマンドをPythonで使う

投稿者: | 9月 7, 2022

ネットワークコマンド : netsh

PowerShell 7.2.6

PS C:\> netsh interface ipv4 show address Wi-Fi

Configuration for interface "Wi-Fi"
    DHCP enabled:                         Yes
    IP Address:                           172.22.1.128
    Subnet Prefix:                        172.22.0.0/21 (mask 255.255.248.0)
    Default Gateway:                      172.22.0.1
    Gateway Metric:                       0
    InterfaceMetric:                      35

Python Script 1

import subprocess


def dfgw_check():
    dfg_addr = subprocess.run(['netsh', 'interface', 'ipv4', 'show', 'address', 'Wi-Fi'],
                                stdout=subprocess.PIPE,
                                stderr=subprocess.PIPE)
    cmd_netsh = dfg_addr.stdout.decode('utf-8')

    netsh_result = cmd_netsh.splitlines()

    for line in netsh_result:
        line0 = line.split()
        #print(line0)
        if 'Default' in line0:
            default_gateway = line0[2]

    ip_reach = subprocess.run(['ping', default_gateway, '-n', '1'],
                            stdout=subprocess.PIPE, stderr=subprocess.PIPE)

    if ip_reach.returncode == 0:
        print(f'Default gateway ({default_gateway}) is reachable \n')
    else:
        print(f'Default gateway ({default_gateway}) is NOT reachable \n')


if __name__ == ('__main__'):
    print(dfgw_check())

Python Script 2 : コマンド結果を一時的にファイルへ保存

import subprocess

def dfgw_check():
    with open('outfile.txt', 'w') as f:
        rf = subprocess.run(['netsh', 'interface', 'ipv4', 'show', 'address', 'Wi-Fi'],
                        stdout=f, stderr=f, text=True ,encoding='utf-8')

    with open('outfile.txt', 'r', encoding='utf-8') as fr:
        outfile = fr.read()

    outfile0 = outfile.splitlines()

    for line in outfile0:
        line0 = line.split()
        if 'Default' in line0:
            default_gateway = line0[2]

    ip_reach = subprocess.run(['ping', default_gateway, '-n', '1'],
                                stdout=subprocess.PIPE, stderr=subprocess.PIPE)

    if ip_reach.returncode == 0:
        print(f'Default gateway ({default_gateway}) is reachable \n')
    else:
        print(f'Default gateway ({default_gateway}) is NOT reachable \n')

if __name__ == ('__main__'):
    print(dfgw_check())

結果

(py310env) PS C:\> & c:/python.exe c:/dfgw_check2.py

Default gateway (172.22.0.1) is reachable