आईपीवी 4 पता मानते हुए, संख्याओं और महत्वपूर्ण विराम चिह्न निकालने का प्रयास करें। फिर आवश्यक होने पर वैध परिणाम का टुकड़ा करें। आईपी पते को भी मान्य करना एक सुरक्षित दृष्टिकोण हो सकता है।
अजगर 3 में:
कोड
import string
import ipaddress
def validate_port(func):
"""Return the results or raise and exception for invalid ports."""
def wrapper(arg):
result = func(arg)
if len(result) == 2 and not result[-1].isdigit():
raise ValueError("Invalid port number.")
return result
return wrapper
@validate_port
def discover_device(device):
"""Return a list of ip and optional port number. Raise exception for invalid ip."""
result = "".join(i for i in device if i in (string.digits +".:")).strip(":").split(":")
try:
ipaddress.ip_address(result[0])
except ValueError as e:
# Numbers in the device name (index 0) or invalid ip
try:
ipaddress.ip_address(result[1])
except IndexError:
raise e
else:
return result[1:]
else:
return result
डेमो
discover_device("[<Device: 192.168.222.123>]")
# ['192.168.222.123']
discover_device("[<Device: 192.168.222.123:8075>]")
# ['192.168.222.123', '8075']
discover_device("[<Device.34: 192.168.222.123:8080>]")
# ['192.168.222.123', '8080']
discover_device("[<Device: 192.168.222123>]")
# ValueError: '192.168.222123' does not appear to be an IPv4 or IPv6 address
discover_device("[<Device21: 192.168.222123>]")
# ValueError: '192.168.222123' does not appear to be an IPv4 or IPv6 address
discover_device("[<device.451: 192.168.222.123:80.805>]")
# ValueError: Invalid port number.
विशेषताएं
- असंवेदनशील आसपास के पात्रों
- आईपी पते का सत्यापन (नहीं IPv6) और अपवाद
- सत्यापित करें पोर्ट संख्या उपकरण का नाम संख्या के खिलाफ
- रक्षा से निपटने (वैकल्पिक)
विवरण के लिए
आमतौर पर result
एक है आईपी और एक वैकल्पिक पोर्ट नंबर शामिल सूची। हालांकि, ऐसे मामलों में जहां डिवाइस नाम में संख्याएं हैं, परिणाम की पहली अनुक्रमणिका में अवांछित संख्याएं शामिल होंगी। यहाँ result
के उदाहरण हैं: उपकरण का नाम संख्या के लिए
# ['192.168.222.123'] ip
# ['192.168.222.123', '8075'] ip, port
# ['192.168.222123'] invalid ip
# ['.34', '192.168.222.123', '8080'] device #, ip, port
# ['192.168.222.123', '80.805'] invalid port
अपवाद हैंडलिंग परीक्षण और पहली या दूसरी सूचकांकों में आई पी पतों को सत्यापित करता है।यदि कोई नहीं मिला है, तो एक अपवाद उठाया जाता है।
हालांकि पोर्ट नंबर मान्य करना प्रश्न के दायरे से बाहर है, बंदरगाहों को एक संख्या माना जाता है। validate_port
सजावटी में एक साधारण परीक्षण जोड़ा गया था, जिसे वांछित के रूप में लागू या अपडेट किया जा सकता है। सजावटी discover_device()
से आउटपुट स्क्रीन करता है। यदि बंदरगाह शुद्ध संख्या नहीं है, तो एक अपवाद उठाया जाता है। प्रतिबंधों को संशोधित करने के लिए this post देखें। पायथन सजावट पर एक महान ट्यूटोरियल के लिए this blog देखें।
विकल्प
तो सत्यापन एक चिंता का विषय, निम्नलिखित कोड पर्याप्त होना चाहिए नहीं है, बशर्ते "."
डिवाइस नाम से अनुपस्थित है:
def discover_device(device):
result = "".join(i for i in device if i in (string.digits +".:")).strip(":").split(":")
if "." not in result[0]:
return result[1:]
return result
एक गैर डेकोरेटर समाधान है पसंदीदा, निम्न फ़ंक्शन को परिभाषित करें:
def validate_port(result):
"""Return the results or raise and exception for invalid ports."""
if len(result) == 2 and not result[-1].isdigit():
raise ValueError("Invalid port number.")
return result
अब बाद के फ़ंक्शन में discover_device()
के वापसी मूल्यों को पास करें, यानी return validate_port(result[1:])
और return validate_port(result)
।
सुझावों के लिए @ कोडर के संबंध में।
तो यदि आपका इनपुट ''[<डिवाइस: 192.168.222.123:8075>]' 'आप' 1 9 2.168.222.123: 8075' भाग निकालना चाहते हैं? – RagingRoosevelt
हां, लेकिन आदर्श रूप से दो अलग-अलग चर ip_var और port_var में। मैं आपकी टिप्पणी को दर्शाने के लिए अपना प्रश्न संपादित करूंगा। धन्यवाद! –
चूंकि यह प्रश्न भावी-प्रूफिंग के बारे में पूछ रहा है, ऐसा लगता है कि सबसे अच्छे उत्तर में आईपीवी 6 पते को संभालने में भी शामिल होगा, साथ ही, * वास्तव में * चीज़ों को पकाएं, क्योंकि उनमें ':' वर्ण शामिल हैं। –