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-адрес сейчас. они могут быть одинаковыми или нет.