Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 24, 2024 11:30:41

atm87
Зарегистрирован: 2024-06-06
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка типа данных

Появляется ошибка. Как исправить? Нужно, чтобы результат был следующим:
Доменное имя для ('10.62.39.1', ‘10.62.39.2’, ‘10.62.39.3’, ‘10.62.39.4’, ‘10.62.39.5’) как ('WS0620390605', ‘WS0620391315’, ‘WS06939354’, ‘WS0650351315’, ‘WS0625481595’)

WS………… - это доменные имена компьютеров, которые должны браться с помощью gethostbyaddr

Ошибка:

 hostname = socket.gethostbyaddr(tuple(iplist))
                 ^^^^^^^^^^^^^^^^^^^^^^
TypeError: gethostbyaddr() argument 1 must be str, bytes or bytearray, not tuple

 import socket
from PyQt6 import QtCore, QtGui, QtWidgets
import ipaddress
 
# проверка на валидацию IP адресов
def ip_checkv4(self):
        ip1 = "10.62.39.1"
        ip2 = "10.62.39.5"
 
        if(ip1 == "" and ip2 == ""):
            print("Начальный и конечный IP-адреса должны быть введены.")
        elif(ipaddress.ip_address(ip1) and ipaddress.ip_address(ip2)):
            ipaddress1 = ip1.split(".") # ['10', '62', '39', '1']
            ipaddress2 = ip2.split(".") #['10', '62', '39', '5']
            if(ipaddress1[:3] == ipaddress2[:3]): # проверка на совпадение первых трех октетов ['10', '62', '39']['10', '62', '39']
                if(ipaddress1[3] < ipaddress2[3]): # если четвертый октет меньше, то выводим диапазон
                    # hostname = socket.gethostbyaddr(ip1)[0]
                    iplist = []
                    ipcur = ipaddress.ip_address(ip1)
                    while ipcur <= ipaddress.ip_address(ip2):
                        iplist.append(str(ipcur))
                        ipcur += 1
                        hostname = socket.gethostbyaddr(ipcur)
                    print(f"Доменное имя для {iplist} как {hostname}")
                else:
                    print("Четвертый октет первого IP адреса должен быть меньше четвертого октета второго IP адреса.")
            else:
                print("Первые три октета IP-адресов не совпадают.")
        else:
            print("Некорректно введены IP адреса.")

Отредактировано atm87 (Июнь 24, 2024 13:22:12)

Офлайн

#2 Июнь 24, 2024 15:00:28

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9798
Репутация: +  849  -
Профиль   Отправить e-mail  

Ошибка типа данных

  
import ipaddress
import socket
 
def make_ip_range(start, end):
    out = []
    ipcur = ipaddress.ip_address(start)
    while ipcur <= ipaddress.ip_address(end):
        out.append(str(ipcur))
        ipcur += 1
    return out
 
def get_domain_name(ip):
    try:
        out = socket.gethostbyaddr(ip)[0]
    except socket.herror:
        out = None
    return out
 
def f():
    ipstart = '10.62.39.1'
    ipend = '10.62.39.12'
    iplist = make_ip_range(ipstart, ipend)
    namelist = list(map(get_domain_name, iplist))
    print(iplist)
    print(namelist)
 
f()

Пример с заглушкой
  
>>> import ipaddress
>>> import socket
>>> 
>>> def make_ip_range(start, end):
...     out = []
...     ipcur = ipaddress.ip_address(start)
...     while ipcur <= ipaddress.ip_address(end):
...         out.append(str(ipcur))
...         ipcur += 1
...     return out
... 
>>> def get_domain_name(ip):
...     try:
...         out = 'name for ' + str(ip)#socket.gethostbyaddr(ip)[0]
...     except socket.herror:
...         out = None
...     return out
... 
>>> def f():
...     ipstart = '10.62.39.1'
...     ipend = '10.62.39.12'
...     iplist = make_ip_range(ipstart, ipend)
...     namelist = list(map(get_domain_name, iplist))
...     print(iplist)
...     print(namelist)
... 
>>> f()
['10.62.39.1', '10.62.39.2', '10.62.39.3', '10.62.39.4', '10.62.39.5', '10.62.39.6', '10.62.39.7', '10.62.39.8', '10.62.39.9', '10.62.39.10', '10.62.39.11', '10.62.39.12']
['name for 10.62.39.1', 'name for 10.62.39.2', 'name for 10.62.39.3', 'name for 10.62.39.4', 'name for 10.62.39.5', 'name for 10.62.39.6', 'name for 10.62.39.7', 'name for 10.62.39.8', 'name for 10.62.39.9', 'name for 10.62.39.10', 'name for 10.62.39.11', 'name for 10.62.39.12']
>>>



Отредактировано py.user.next (Июнь 24, 2024 15:02:13)

Офлайн

#3 Июнь 24, 2024 15:15:15

atm87
Зарегистрирован: 2024-06-06
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка типа данных

Додумался сам, но думаю это как-то не красиво))

 iplist = []
hostname = []
ipcur = ipaddress.ip_address(ip1)
while ipcur <= ipaddress.ip_address(ip2):
    iplist.append(str(ipcur))
    ipcur += 1
    addr = socket.gethostbyaddr(str(ipcur))[0]
    hostname.append(addr)
print(f"Domain names {iplist} as {hostname}")

Отредактировано atm87 (Июнь 24, 2024 15:15:54)

Офлайн

#4 Июнь 25, 2024 14:45:50

atm87
Зарегистрирован: 2024-06-06
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка типа данных

Вот так сейчас выглядит мой код:

 def ip_checkv4(self):
        ip1 = "10.62.39.1"
        ip2 = "10.62.39.5"
        if(ip1 == "" and ip2 == ""):
            print("Начальный и конечный IP-адреса должны быть введены.")
        elif(ipaddress.ip_address(ip1) and ipaddress.ip_address(ip2)):
            ipaddress1 = ip1.split(".")
            ipaddress2 = ip2.split(".")
            if(ipaddress1[:3] == ipaddress2[:3]): # проверка на совпадение первых трех октетов
                if(ipaddress1[3] < ipaddress2[3]): # если четвертый октет меньше, то выводим диапазон
                    iplist = []
                    hostname = []
                    ipcur = ipaddress.ip_address(ip1)
                    while ipcur <= ipaddress.ip_address(ip2):
                        iplist.append(str(ipcur))
                        ipcur += 1
                        addr = socket.gethostbyaddr(str(ipcur))[0]
                        hostname.append(addr)
                    print(f"IP-адресу {iplist} соответствует доменное имя {hostname}")
                else:
                    print("Четвертый октет первого IP адреса должен быть меньше четвертого октета второго IP адреса.")
            else:
                print("Первые три октета IP-адресов не совпадают.")
        else:
            print("Некорректно введены IP адреса.")
Вопрос. Если компьютер с IP адресом 10.62.39.4 отсутствует в домене, то появляется ошибка:
 addr = socket.gethostbyaddr(str(ipcur))[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
socket.herror: [Errno 11004] host not found
Как мне сделать так, чтобы, если какой-то компьютер не доступен, то выводилось бы сообщение “ПК не доступен”.

Офлайн

#5 Июнь 25, 2024 18:55:23

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9798
Репутация: +  849  -
Профиль   Отправить e-mail  

Ошибка типа данных

  
>>> import socket
>>> 
>>> def get_domain_name(ip):
...     try:
...         out = socket.gethostbyaddr(ip)[0]
...     except socket.herror:
...         out = None
...     return out
... 
>>> def test_address(address):
...     if get_domain_name(address) is not None:
...         print(address, 'доступен')
...     else:
...         print(address, 'недоступен')
... 
>>> test_address('127.0.0.1')
127.0.0.1 доступен
>>> test_address('123.0.0.1')
123.0.0.1 недоступен
>>>



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version