Сценарий Bash, который тестирует на IP

http://linux-ha.org/ для всех Ваших высоконадежных потребностей. Как песня говорит, лучшие вещи в жизни свободны.

3
задан 26 August 2009 в 04:43
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

Править: забыл fgrep :)

7
ответ дан 3 December 2019 в 04:56
  • 1
    этому regexp нужны обратные косые черты перед точками. это будет соответствовать многим другим адресам включая 192.168.101, 192.168.111, 192.168.121 и так далее, а также 192.168.1. так " grep-q ' inet 192\.168\.1\.1' " –  cas 26 August 2009 в 05:11
  • 2
    Альтернатива обратным косым чертам: используйте grep -F (или fgrep), который соответствует точным шаблонам, не regexes. –  David Z 26 August 2009 в 08:50
  • 3
    That' s бесполезное использование теста. Вы могли просто поместить канал с grep в конце между если и тогдашний. –  chris 26 August 2009 в 17:20
  • 4
    Никакая гарантия, что eth0 является Вашим сетевым устройством, или даже если это - сетевое устройство, что это - основное. –  kmarsh 26 August 2009 в 17:23
  • 5
    @chris: Правда, однако it' s легко модифицируемый для его конкретного приложения. Мне нравится думать, что люди достаточно умны для фактического понимания что I' m выполнение и смочь изменить его самостоятельно. @kmarsh: Да it' s UUOT, однако для демонстрации кодируют, я думаю it' s немного легче понять для кого-то с не много опыта со сценариями. В этом случае предотвращение теста с остротой является бесполезной оптимизацией. –  MikeyB 26 August 2009 в 20:22

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

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

2
ответ дан 3 December 2019 в 04:56

Это - больше комментарий к ответу 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

И можно далее упростить это при помощи поисков regex, встроенных в большинство оболочек Bourne при помощи оператора выбора:

case $(ifconfig)
in 
  *"inet 192.168.1.1"*) 
     echo "IP found" 
   ;;
  *) 
    echo "IP not found" 
   ;; 
esac
1
ответ дан 3 December 2019 в 04:56

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

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

затем Ваши другие сценарии могут просто кошка что файл для получения текущего IP.

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

0
ответ дан 3 December 2019 в 04:56

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

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

0
ответ дан 3 December 2019 в 04:56


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

0
ответ дан 3 December 2019 в 04:56

Теги

Похожие вопросы