Есть ли элегантный способ проверить 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. Возможно, есть более элегантный способ сделать это, но он выполняет свою работу независимо от элегантности.