Назад | Перейти на главную страницу

BASH-скрипт, который проверяет IP

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

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

if IP=192.168.1.1
      then do this
 else
      then do that

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

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

РЕДАКТИРОВАТЬ: забыл fgrep :)

Если нужно различать, подключены вы к интрасети или нет,
вы можете проверить с помощью быстрого короткого пинга или попытки 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 уже:

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

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

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

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

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

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

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

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

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