Получить локальные настройки DNS в Python - PullRequest
0 голосов
/ 13 января 2020

Есть ли какой-нибудь элегантный и кроссплатформенный (Python) способ получения локальных настроек DNS?

Возможно, он может работать со сложной комбинацией модулей, таких как platform и subprocess, но возможно, уже есть хороший модуль, такой как netifaces, который может извлечь его в низкоуровневом режиме и сэкономить некоторые усилия по «повторному созданию колеса».

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

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 13 января 2020

Может быть, это решит вашу проблему

import subprocess

def get_local_dns(cmd_):
    with open('dns1.txt', 'w+') as f:
        with open('dns_log1.txt', 'w+') as flog:
            try:
                process = subprocess.Popen(cmd_, stdout=f, stderr=flog)
            except FileNotFoundError as e:
                flog.write(f"Error while executing this command {str(e)}")


linux_cmd = ['cat', '/etc/resolv.conf']
windows_cmd = ['windows_command', 'parameters']
commands = [linux_cmd, windows_cmd]


if __name__ == "__main__":
    for cmd in commands:
        get_local_dns(cmd)

0 голосов
/ 13 января 2020

Спасибо @MasterOfTheHouse. Я закончил тем, что написал свою собственную функцию. Это не так элегантно, но на данный момент делает работу. Есть много возможностей для совершенствования, но хорошо ...

import os
import subprocess

def get_dns_settings()->dict:
    # Initialize the output variables
    dns_ns, dns_search = [], ''

    # For Unix based OSs
    if os.path.isfile('/etc/resolv.conf'):
        for line in open('/etc/resolv.conf','r'):
            if line.strip().startswith('nameserver'):
                nameserver = line.split()[1].strip()
                dns_ns.append(nameserver)
            elif line.strip().startswith('search'):
                search = line.split()[1].strip()
                dns_search = search

    # If it is not a Unix based OS, try "the Windows way"
    elif os.name == 'nt':
        cmd = 'ipconfig /all'
        raw_ipconfig = subprocess.check_output(cmd)
        # Convert the bytes into a string
        ipconfig_str = raw_ipconfig.decode('cp850')
        # Convert the string into a list of lines
        ipconfig_lines = ipconfig_str.split('\n')

        for n in range(len(ipconfig_lines)):
            line = ipconfig_lines[n]
            # Parse nameserver in current line and next ones
            if line.strip().startswith('DNS-Server'):
                nameserver = ':'.join(line.split(':')[1:]).strip()
                dns_ns.append(nameserver)
                next_line = ipconfig_lines[n+1]
                # If there's too much blank at the beginning, assume we have
                # another nameserver on the next line
                if len(next_line) - len(next_line.strip()) > 10:
                    dns_ns.append(next_line.strip())
                    next_next_line = ipconfig_lines[n+2]
                    if len(next_next_line) - len(next_next_line.strip()) > 10:
                        dns_ns.append(next_next_line.strip())

            elif line.strip().startswith('DNS-Suffix'):
                dns_search = line.split(':')[1].strip()

    return {'nameservers': dns_ns, 'search': dns_search}

print(get_dns_settings())

Кстати ... как вам удалось написать два ответа с одной и той же учетной записью?

0 голосов
/ 13 января 2020

Используя подпроцесс, вы можете сделать что-то подобное в MacBook или Linux системе

import subprocess

process = subprocess.Popen(['cat', '/etc/resolv.conf'],
                     stdout=subprocess.PIPE,
                     stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
print(stdout, stderr)

или сделать что-то подобное

import subprocess
with open('dns.txt', 'w') as f:
    process = subprocess.Popen(['cat', '/etc/resolv.conf'], stdout=f)

Первый вывод будет go к stdout и второму файлу

...