GNU/Linux >> Linux Esercitazione >  >> Linux

Verificare la validità dell'IP

Usa ipcalc ( testato con il pacchetto versione in RPM initscripts-9.49.49-1)

$ ipcalc -cs 10.10.10.257 && echo vaild_ip || echo invalid_ip
invalid_ip

Questa singola espressione regolare dovrebbe convalidare solo gli indirizzi compresi tra 0.0.0.0 e 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

Se stai usando bash, puoi fare una semplice regex match per il pattern, senza convalidare i quad:

#!/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

Se sei bloccato con una shell POSIX, puoi usare expr per fare praticamente la stessa cosa, usando BRE invece di ERE:

#!/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

Nota che expr presuppone che la tua regex sia ancorata al lato sinistro della stringa, quindi il ^ iniziale non è necessario.

Se è importante verificare che ogni quad è inferiore a 256, ovviamente avrai bisogno di più codice:

#!/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

O forse anche con meno pipe:

#!/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

O ancora, se la tua shell è bash, potresti usare un'espressione regolare ingombrante per la convalida quad se non sei appassionato di aritmetica:

#!/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

Questo potrebbe anche essere espresso in BRE, ma è più digitazione di quello che ho tra le dita.

E infine, se ti piace l'idea di mettere questa funzionalità... in una funzione:

#!/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
  local quad
  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

Ci sono molti modi per farlo. Te ne ho mostrati solo alcuni.


Lo script Validating an IP Address in a Bash Scriptby Mitch Frazier fa quello che vuoi fare:

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
}

Linux
  1. Lo scopo della parola chiave "do" in Bash For Loops?

  2. Verificare il processo se lo stesso è in esecuzione?

  3. Elenco di query dei server per memoria/cpu allocata?

  4. Esiste una riga per verificare la presenza di file?

  5. Controllare il database per la corruzione

Come controllare (scansionare) le porte aperte in Linux

Come controllare le porte di ascolto in Linux (porte in uso)

Esercitazione sui comandi echo Linux per principianti (5 esempi)

Come verificare la presenza di openCV su Ubuntu 9.10

controlla se l'argomento è una data valida nella shell bash

Shell =Controlla se la variabile inizia con #