मैं शैल स्क्रिप्ट में किसी आईपी पते की वैधता कैसे देखूं, जो 0.0.0.0
से 255.255.255.255
तक है?आईपी वैधता के लिए जाँच करें
उत्तर
आप बैश का उपयोग कर रहे हैं, तो आप के लिए एक सरल regex मैच कर सकते हैं: http://www.linuxjournal.com/content/validating-ip-address-bash-script
कोड सहित संपादित करें, जैसा कि नीचे का सुझाव दिया पैटर्न, quads मान्य बिना:
#!/usr/bin/env bash
ip=1.2.3.4
if [[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "success"
else
echo "fail"
fi
आप एक POSIX खोल के साथ फंस रहे हैं, तो आप expr
उपयोग कर सकते हैं मूल रूप से एक ही बात करने के लिए, यू BRE गाना ERE के बजाय: expr
मान लिया गया
#!/bin/sh
ip=1.2.3.4
if expr "$ip" : '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$' >/dev/null; then
echo "success"
else
echo "fail"
fi
ध्यान दें कि कि आपके regex, स्ट्रिंग के बाएँ हाथ की ओर करने के लिए लंगर डाले है तो प्रारंभिक ^
अनावश्यक है।
यदि यह सत्यापित करने के लिए कि प्रत्येक ट्रैक्टर 256 से भी कम है महत्वपूर्ण है, तो आप स्पष्ट रूप से अधिक कोड की आवश्यकता होगी:
#!/bin/sh
ip=${1:-1.2.3.4}
if expr "$ip" : '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$' >/dev/null; then
for i in 1 2 3 4; do
if [ $(echo "$ip" | cut -d. -f$i) -gt 255 ]; then
echo "fail ($ip)"
exit 1
fi
done
echo "success ($ip)"
exit 0
else
echo "fail ($ip)"
exit 1
fi
या शायद उससे भी कम पाइप के साथ:
#!/bin/sh
ip=${1:-1.2.3.4}
if expr "$ip" : '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$' >/dev/null; then
IFS=.
set $ip
for quad in 1 2 3 4; do
if eval [ \$$quad -gt 255 ]; then
echo "fail ($ip)"
exit 1
fi
done
echo "success ($ip)"
exit 0
else
echo "fail ($ip)"
exit 1
fi
या फिर, अगर आपका खोल बैश है, यदि आप अंकगणित के शौकीन नहीं हैं तो आप क्वाड सत्यापन के लिए एक बोझिल नियमित अभिव्यक्ति का उपयोग कर सकते हैं:
#!/usr/bin/env bash
ip=${1:-1.2.3.4}
re='^(0*(1?[0-9]{1,2}|2([0-4][0-9]|5[0-5]))\.){3}'
re+='0*(1?[0-9]{1,2}|2([0-4][0-9]|5[0-5]))$'
if [[ $ip =~ $re ]]; then
echo "success"
else
echo "fail"
fi
यह बीआरई में भी व्यक्त किया जा सकता है, लेकिन यह मेरी उंगलियों में से अधिक टाइपिंग है।
और अंत में, अगर आप इस कार्यक्षमता डाल ... एक समारोह में करने का विचार पसंद:
#!/usr/bin/env bash
ip=${1:-1.2.3.4}
ipvalid() {
# Set up local variables
local ip=${1:-1.2.3.4}
local IFS=.; local -a a=($ip)
# Start with a regex format test
[[ $ip =~ ^[0-9]+(\.[0-9]+){3}$ ]] || return 1
# Test values of quads
for quad in {0..3}; do
[[ "${a[$quad]}" -gt 255 ]] && return 1
done
return 0
}
if ipvalid "$ip"; then
echo "success ($ip)"
exit 0
else
echo "fail ($ip)"
exit 1
fi
ऐसे कई तरीके आप यह कर सकते हैं। मैंने आपको कुछ दिखाया है।
अच्छा समाधान। इससे मेरा काम बनता है! मैंने देखा, हालांकि, आपके 'ipvalid' फ़ंक्शन का उपयोग करके इनपुट चर संशोधित हो जाता है (उदाहरण के लिए 111.222.333.444 फ़ंक्शन कॉल होने के बाद 111 222 333 444 बन जाता है)। मुझे लगता है कि यह 'स्थानीय-ए = ($ आईपी)' पर होता है। मैंने इसे मैकोज़ और डेबियन दोनों पर झुकाव में देखा। – focorner
@focorner, आपको यह पसंद है खुशी है। :) इनपुट चर संशोधित नहीं होता है, लेकिन 'IFS = .' इसे * व्यक्त * व्यक्त करता है। मुझे संदेह है कि यहां सबसे अच्छा समाधान क्षेत्र विभाजक को स्थानीय रूप से असाइन करना है, इसलिए 'स्थानीय आईएफएस = .;', ताकि परिवर्तन फ़ंक्शन के बाहर व्यवहार को प्रभावित न करे। मैंने उपरोक्त स्क्रिप्ट में यह परिवर्तन किया है; कृपया मुझे बताएं कि क्या यह अभी भी आपके लिए एक ही व्यवहार दिखाता है। – ghoti
ghoti, आप सही हैं: 'IFS = .' को फ़ंक्शन के अंदर स्थानीय के रूप में सेट करें जैसा कि आपने सुझाव दिया है कि चाल है। धन्यवाद। ए + – focorner
मेरा मानना है कि इस स्क्रिप्ट क्या आप क्या करना चाहते है:
function valid_ip()
{
local ip=$1
local stat=1
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
OIFS=$IFS
IFS='.'
ip=($ip)
IFS=$OIFS
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
&& ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
stat=$?
fi
return $stat
}
आप एक दूसरे से यह करने के लिए मुझे हराया। नीचे दी गई टिप्पणियों को भी जांचना सुनिश्चित करें, कुछ मामलों को संभालने के लिए कुछ संशोधन हैं। – PeterJ
यह बैश है, पॉज़िक्स नहीं। ओपी ने निर्दिष्ट किया है कि वह लिनक्स का उपयोग कर रहा है, लेकिन जरूरी नहीं कि बैश शेल है। – ghoti
आपको दोनों सुविधा के लिए कोड को अपनी पोस्ट में संपादित करना चाहिए और यदि लिंक नीचे जाता है तो आपका उत्तर अमान्य नहीं होता है। – icktoofay
पर्ल विभिन्न चीजों सत्यापित करने के लिए एक महान मॉड्यूल Regexp::Common है:
perl -MRegexp::Common=net -e 'exit(shift() !~ /^$RE{net}{IPv4}$/)' $ipaddr
आप की आवश्यकता हो सकती sudo cpan install Regexp::Common
पहले
मैं एक समारोह में लपेट चाहते हैं:
valid_ip() {
perl -MRegexp::Common=net -e 'exit(shift() !~ /^$RE{net}{IPv4}$/)' "$1"
}
if valid_ip 123.234.345.456; then
echo OK
else
echo INVALID
fi
अच्छा। हालांकि, मैं ज्यादातर लोगों के लिए प्रत्यक्ष सीपीएएन इंस्टॉल की सिफारिश नहीं करूँगा। यदि पैकेज भंडार से मॉड्यूल स्थापित किए जा सकते हैं, तो आप आमतौर पर अपने सिस्टम क्लीनर और अधिक सुरक्षित रखेंगे। उबंटू में, आप मुफ्त में libregexp-common-perl 'स्थापित कर सकते हैं, फ्रीबीएसडी में, यह' सीडी/यूएसआर/पोर्ट्स/टेक्स्टप्रोक/पी 5-रेगेक्सपी-कॉमन एंड इंस्टॉल करें 'होगा। – ghoti
ठेठ इसके लिए समाधान नियमित अभिव्यक्तियों का उपयोग करने लगते हैं, लेकिन यह मेरे लिए होता है कि यह कुछ ऐसा करने का बेहतर तरीका हो सकता है:
if echo "$ip" | { IFS=. read a b c d e;
test "$a" -ge 0 && test "$a" -le 255 &&
test "$b" -ge 0 && test "$b" -le 255 &&
test "$c" -ge 0 && test "$c" -le 255 &&
test "$d" -ge 0 && test "$d" -le 255 &&
test -z "$e"; }; then echo is valid; fi
ध्यान दें कि यह स्ट्रिंग '1.2.3.4.' के लिए विफल रहता है (पीछे की ओर ध्यान दें' 0) –
यह सिर्फ पीछे बिंदु नहीं है, यह भी '1.2.3.4.a' पर झूठा परिणाम देता है। स्पष्ट रूप से बैश में आप अपने उत्तर में कोड के माध्यम से चलाने से पहले '$ ip' प्री-टेस्ट करने के लिए, एक पैटर्न मिलान, शायद एक extglob का उपयोग कर सकते हैं, लेकिन आप POSIX में क्या कर सकते हैं? – ghoti
@ghoti एक अच्छा मुद्दा बनाता है। हम इसे 5 वें चर के साथ आसानी से और अधिक मजबूत बना सकते हैं जो खाली होना चाहिए। (मैं इस बात पर कोई दावा नहीं कर रहा हूं कि यह विश्वसनीय है, लेकिन यह संपादन निश्चित रूप से बेहतर है।) –
ipcalc
$ ipcalc -cs 10.10.10.257 && echo vail_ip || echo invalid_ip
invalid_ip
मेरे सिस्टम (डेबियन लिनक्स), '-s' पर काम नहीं करता है पैरामीटर एक तर्क की अपेक्षा करता है और त्रुटि होने पर भी रिटर्न कोड 0 होता है। –
इसे '-s' पैरामीटर की वजह से सिग्विन पर काम नहीं कर सका। जवाब @ जोनसाउथ द्वारा "यह सिंगल रेगेक्स ..." नीचे दी गई कुछ पोस्ट एक आकर्षण की तरह काम करती है। –
उपयोग यह एकल regex 0.0.0.0 और 255.255.255 के बीच केवल उन पतों को मान्य होना चाहिए।255:
#!/bin/bash
ip="1.2.3.4"
if [[ "$ip" =~ ^(([1-9]?[0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))\.){3}([1-9]?[0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))$ ]]; then
echo "success"
else
echo "fail"
fi
#!/bin/bash
read -p " ip: " req_ipadr
#
ip_full=$(echo $req_ipadr | sed -n 's/^\(\(\([1-9][0-9]\?\|[1][0-9]\{0,2\}\|[2][0-4][0-9]\|[2][5][0-4]\)\.\)\{3\}\([1-9][0-9]\?\|[1][0-9]\{0,2\}\|[2][0-4][0-9]\|[2][5][0-4]\)\)$/\1/p')
#
[ "$ip_full" != "" ] && echo "$req_ipadr vaild ip" || echo "$req_ipadr invaild ip"
मैं शेयरों वाला HERE नीचे पाया जो मैं बहुत आसान लगा।
#!/bin/bash
# Test an IP address for validity:
# Usage:
# valid_ip IP_ADDRESS
# if [[ $? -eq 0 ]]; then echo good; else echo bad; fi
# OR
# if valid_ip IP_ADDRESS; then echo good; else echo bad; fi
#
function valid_ip()
{
local ip=$1
local stat=1
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
OIFS=$IFS
IFS='.'
ip=($ip)
IFS=$OIFS
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
&& ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
stat=$?
fi
return $stat
}
मैंने सभी कोड tweaked और यह सहायक होने के लिए पाया।
#!/bin/bash
ip="256.10.10.100"
if [[ "$ip" =~ (([01]{,1}[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.([01]{,1}[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.([01]{,1}[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.([01]{,1}[0-9]{1,2}|2[0-4][0-9]|25[0-5]))$ ]]; then
echo "success"
else
echo "fail"
fi
तुम कोशिश मेरी सुझाव यहां पोस्ट कर सकता है: https://unix.stackexchange.com/a/389565/249079 – Ganapathy