BASH-скрипт для проверки IP

Есть ли элегантный способ проверить IP-адрес в скрипте BASH? Я мог бы сделать ifconfig и сузить IP, используя sed/awk, но я думаю, что есть более простое решение.

Мое приложение в основном использует сценарии SSH/SCP, когда я нахожусь в моей внутренней сети, а пока нет. Итак, я хочу этот тип потока

if IP=192.168.1.1
      then do this
 else
      then do that

6 ответов

Решение

Что-то довольно простое, что вы можете изменить в соответствии со своими потребностями:

ip addr show dev eth0 | fgrep -q 'inet 192.168.1.1'
if [ $? -eq 0 ]; then
   echo 'IP found'
else
   echo 'IP not found'
fi

РЕДАКТИРОВАТЬ: забыл фгреп:)

Если это вопрос дифференциации, если вы подключены к интранету или нет,
Вы можете проверить с помощью быстрого короткого пинга или попытки arp для IP-адреса известного внутреннего сервера.
Если IP не отвечает, вы, вероятно, находитесь за пределами интрасети.

Могут быть небольшие глюки (например, сервер временно отключен).
Это может быть разрешено (вы по ошибке переключаетесь в режим Интернета),
Или, далее проверено с несколькими проверками (по различным внутренним ресурсам).

Это больше комментарий к ответу mikeB, но комментарии не разрешают код, поэтому я опубликую его как ответ:

Вы можете использовать что-то вроде grep, чтобы найти то, что вы ищете, например,

ip addr show dev eth0 | fgrep -q 'inet 192.168.1.1'
if [ $? -eq 0 ]; then
   echo 'IP found'
else
   echo 'IP not found'
fi

На самом деле это можно упростить, избавившись от теста ( [это псевдоним для теста) статуса выхода, потому что, если он уже проверяет статус выхода напрямую, то как тест связывается, если уже:

if 
  ifconfig | fgrep -q 'inet 192.168.1.1'
then
  echo "IP Found"
else
  echo "IP Not found"
fi

И вы можете еще больше упростить это с помощью поиска регулярных выражений, встроенного в большинство оболочек Борна, с помощью оператора case:

case $(ifconfig)
in 
  *"inet 192.168.1.1"*) 
     echo "IP found" 
   ;;
  *) 
    echo "IP not found" 
   ;; 
esac

ip addr show <DEVICE> | grep inet | grep -v inet6 | awk '{print $2}'

Это должно вывести ваш IP, надеюсь. Вероятно, есть более элегантный способ сделать это, но он выполняет свою работу независимо от элегантности.


#!/bin/bash
address="192.168.0.1"
interface="eth0"

ip=$(ifconfig -a $interface | awk -F: '/inet/ {print $2}' | head -n 1 | awk '{print $1}') if [ ${ip} == ${address} ]; then #Do something fi

Один (IMO, более сложный и более подверженный сбоям) метод заключается в настройке вашего клиента DHCP для сохранения назначенного IP-адреса в каком-либо удобном файле.

например, с помощью dhclient вы можете просто удалить скрипт в /etc/dhcp3/dhclient-enter-hooks.d/, чтобы сохранить текущий IP в файл, скажем /var/run/current-IP.txt

тогда другие ваши скрипты могут просто отследить этот файл, чтобы получить текущий IP.

проблема, связанная с выполнением чего-либо подобного, заключается в том, что он сообщает вам только ваш IP-адрес, когда он был последний раз назначен dhcp. Это на самом деле не говорит вам, какой ваш IP-адрес сейчас. они могут быть одинаковыми или нет.

Другие вопросы по тегам