2012-12-08 13 views

उत्तर

29

आप बैश का उपयोग कर रहे हैं, तो आप के लिए एक सरल 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 

ऐसे कई तरीके आप यह कर सकते हैं। मैंने आपको कुछ दिखाया है।

+0

अच्छा समाधान। इससे मेरा काम बनता है! मैंने देखा, हालांकि, आपके 'ipvalid' फ़ंक्शन का उपयोग करके इनपुट चर संशोधित हो जाता है (उदाहरण के लिए 111.222.333.444 फ़ंक्शन कॉल होने के बाद 111 222 333 444 बन जाता है)। मुझे लगता है कि यह 'स्थानीय-ए = ($ आईपी)' पर होता है। मैंने इसे मैकोज़ और डेबियन दोनों पर झुकाव में देखा। – focorner

+1

@focorner, आपको यह पसंद है खुशी है। :) इनपुट चर संशोधित नहीं होता है, लेकिन 'IFS = .' इसे * व्यक्त * व्यक्त करता है। मुझे संदेह है कि यहां सबसे अच्छा समाधान क्षेत्र विभाजक को स्थानीय रूप से असाइन करना है, इसलिए 'स्थानीय आईएफएस = .;', ताकि परिवर्तन फ़ंक्शन के बाहर व्यवहार को प्रभावित न करे। मैंने उपरोक्त स्क्रिप्ट में यह परिवर्तन किया है; कृपया मुझे बताएं कि क्या यह अभी भी आपके लिए एक ही व्यवहार दिखाता है। – ghoti

+0

ghoti, आप सही हैं: 'IFS = .' को फ़ंक्शन के अंदर स्थानीय के रूप में सेट करें जैसा कि आपने सुझाव दिया है कि चाल है। धन्यवाद। ए + – focorner

4

मेरा मानना ​​है कि इस स्क्रिप्ट क्या आप क्या करना चाहते है:

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 
} 
+2

आप एक दूसरे से यह करने के लिए मुझे हराया। नीचे दी गई टिप्पणियों को भी जांचना सुनिश्चित करें, कुछ मामलों को संभालने के लिए कुछ संशोधन हैं। – PeterJ

+0

यह बैश है, पॉज़िक्स नहीं। ओपी ने निर्दिष्ट किया है कि वह लिनक्स का उपयोग कर रहा है, लेकिन जरूरी नहीं कि बैश शेल है। – ghoti

+1

आपको दोनों सुविधा के लिए कोड को अपनी पोस्ट में संपादित करना चाहिए और यदि लिंक नीचे जाता है तो आपका उत्तर अमान्य नहीं होता है। – icktoofay

0

पर्ल विभिन्न चीजों सत्यापित करने के लिए एक महान मॉड्यूल 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 
+1

अच्छा। हालांकि, मैं ज्यादातर लोगों के लिए प्रत्यक्ष सीपीएएन इंस्टॉल की सिफारिश नहीं करूँगा। यदि पैकेज भंडार से मॉड्यूल स्थापित किए जा सकते हैं, तो आप आमतौर पर अपने सिस्टम क्लीनर और अधिक सुरक्षित रखेंगे। उबंटू में, आप मुफ्त में libregexp-common-perl 'स्थापित कर सकते हैं, फ्रीबीएसडी में, यह' सीडी/यूएसआर/पोर्ट्स/टेक्स्टप्रोक/पी 5-रेगेक्सपी-कॉमन एंड इंस्टॉल करें 'होगा। – ghoti

1

ठेठ इसके लिए समाधान नियमित अभिव्यक्तियों का उपयोग करने लगते हैं, लेकिन यह मेरे लिए होता है कि यह कुछ ऐसा करने का बेहतर तरीका हो सकता है:

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 
+0

ध्यान दें कि यह स्ट्रिंग '1.2.3.4.' के लिए विफल रहता है (पीछे की ओर ध्यान दें' 0) –

+0

यह सिर्फ पीछे बिंदु नहीं है, यह भी '1.2.3.4.a' पर झूठा परिणाम देता है। स्पष्ट रूप से बैश में आप अपने उत्तर में कोड के माध्यम से चलाने से पहले '$ ip' प्री-टेस्ट करने के लिए, एक पैटर्न मिलान, शायद एक extglob का उपयोग कर सकते हैं, लेकिन आप POSIX में क्या कर सकते हैं? – ghoti

+1

@ghoti एक अच्छा मुद्दा बनाता है। हम इसे 5 वें चर के साथ आसानी से और अधिक मजबूत बना सकते हैं जो खाली होना चाहिए। (मैं इस बात पर कोई दावा नहीं कर रहा हूं कि यह विश्वसनीय है, लेकिन यह संपादन निश्चित रूप से बेहतर है।) –

5

ipcalc

$ ipcalc -cs 10.10.10.257 && echo vail_ip || echo invalid_ip 
invalid_ip 
+1

मेरे सिस्टम (डेबियन लिनक्स), '-s' पर काम नहीं करता है पैरामीटर एक तर्क की अपेक्षा करता है और त्रुटि होने पर भी रिटर्न कोड 0 होता है। –

+0

इसे '-s' पैरामीटर की वजह से सिग्विन पर काम नहीं कर सका। जवाब @ जोनसाउथ द्वारा "यह सिंगल रेगेक्स ..." नीचे दी गई कुछ पोस्ट एक आकर्षण की तरह काम करती है। –

1

उपयोग यह एकल 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 
0
#!/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" 
1

मैं शेयरों वाला 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 
} 
1

मैंने सभी कोड 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