Linux bash script для извлечения IP-адреса

Я хочу сделать большой script на моем Debian 7.3 (что-то вроде переведенного и гораздо более нового удобного для пользователя окружения). У меня проблема. Я хочу использовать только некоторые данные, которые дают команды. Например, мой ifconfig выглядит так:

eth0      Link encap:Ethernet  HWaddr 08:00:27:a3:e3:b0  
          inet addr:192.168.1.103  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fea3:e3b0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1904 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2002 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1309425 (1.2 MiB)  T

Я хочу отобразить только IP-адрес в строке: echo "Ваш IP-адрес: (IP_ADDRESS)". Есть ли какая-нибудь команда, которая позволяет мне делать такую ​​вещь, искать в потоке информацию, которую я хочу получить?. Я знаю о grep и sed, но я не очень хорош с ними.

Изменить: во-первых, спасибо за помощь в решении этой проблемы, теперь я знаю гораздо больше. Во-вторых, проект идет. Если бы кто-нибудь был заинтересован в этом, просто меня.

Ответ 1

Чтобы просто получить свой IP-адрес:

echo `ifconfig eth0 2>/dev/null|awk '/inet addr:/ {print $2}'|sed 's/addr://'`

Это даст вам IP-адрес eth0.

Изменить: из-за изменения имен интерфейсов в последних версиях Ubuntu это больше не работает. Вместо этого вы можете просто использовать это:

hostname --all-ip-addresses или hostname -I, что делает то же самое (дает вам ВСЕ IP-адреса хоста).

Ответ 2

Если цель состоит в том, чтобы найти IP-адрес, подключенный в направлении Интернета, то это должно быть хорошим решением.


ОБНОВИТЬ!!! С новой версией Linux вы получите больше информации на линии:

ip route get 8.8.8.8
8.8.8.8 via 10.36.15.1 dev ens160 src 10.36.15.150 uid 1002
    cache

поэтому для получения IP нужно найти IP после src

ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}'
10.36.15.150

и если вам нравится имя интерфейса

ip route get 8.8.8.8 | awk -F"dev " 'NR==1{split($2,a," ");print a[1]}'
ens192

ip route не открывает никакого соединения, он просто показывает маршрут, необходимый для перехода к 8.8.8.8. 8.8.8.8 - это Google DNS.

Если вы хотите сохранить это в переменной, выполните:

my_ip=$(ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}')

my_interface=$(ip route get 8.8.8.8 | awk -F"dev " 'NR==1{split($2,a," ");print a[1]}')

Почему другое решение может дать сбой:

ifconfig eth0

  • Если у вашего интерфейса есть другое имя (eno1, wifi, venet0 и т.д.)
  • Если у вас более одного интерфейса
  • IP-соединение не является первым в списке из более чем одного IF

Hostname -I

  • Может получить только 127.0.1.1
  • Не работает на всех системах.

Ответ 4

ip -4 addr show eth0 | grep -oP "(?<=inet ).*(?=/)"

Ответ 5

Сделайте выбор:

$ cat file
eth0      Link encap:Ethernet  HWaddr 08:00:27:a3:e3:b0
          inet addr:192.168.1.103  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fea3:e3b0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1904 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2002 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1309425 (1.2 MiB)  T

$ awk 'sub(/inet addr:/,""){print $1}' file
192.168.1.103

$ awk -F'[ :]+' '/inet addr/{print $4}' file
192.168.1.103

Ответ 6

  /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'

Ответ 7

ip route get 8.8.8.8| grep src| sed 's/.*src \(.*\)$/\1/g'

Ответ 8

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

hostname -I | awk '{ print $1 }'

Ответ 9

Просто заметьте, так как я просто потратил некоторое время на устранение неудачного обновления на сервере. Оказалось, что (несколько лет назад) я выполнил тест, чтобы увидеть, присутствовали ли динамически добавленные интерфейсы (например, eth0: 1), и если это так, я бы привязал определенную proggis к "главному" IP на eth0. В основном это был вариант решения "ifconfig | grep... | sed..." (плюс проверка наличия "eth0:" ).
Обновление принесло новые сетевые инструменты, и с ним результат немного изменился:

старый ifconfig:

eth0      Link encap:Ethernet  HWaddr 42:01:0A:F0:B0:1D
          inet addr:10.240.176.29  Bcast:10.240.176.29  Mask:255.255.255.255
          UP BROADCAST RUNNING MULTICAST  MTU:1460  Metric:1
          ...<SNIP>

тогда как новая версия отобразит это:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1460
      inet 10.240.212.165  netmask 255.255.255.255  broadcast 10.240.212.165
      ...<SNIP>

рендеринг охоты на "eth0:", а также "inet addr:" поиск busted (неважно интерфейсы, называемые "em0", "br0" или "wlan0"...). Конечно, вы можете проверить "inet" (или "inet6" ) и сделать дополнительную часть addr: part, но, глядя ближе, вы увидите, что более или менее все изменилось, "Маска" теперь "netmask",...

Предложение "ip route..." довольно изящное - так возможно:

_MyIP="$( ip route get 8.8.8.8 | awk 'NR==1 {print $NF}' )"
if [ "A$_MyIP" == "A" ]
then
    _MyIPs="$( hostname -I )"
    for _MyIP in "$_MyIPs"
    do
        echo "Found IP: \"$_MyIP\""
    done
else
    echo "Found IP: $_MyIP"
fi

Что-то в этом роде. Поскольку все предлагаемые решения, похоже, имеют обстоятельства, в которых они терпят неудачу, проверьте возможные случаи краев - нет eth, multiple eth и lo's, когда будет "hostname -i" терпеть неудачу,... а затем принять решение о наилучшем решении, проверить его работу, иначе 2-й лучший.

Приветствия пива!

Ответ 10

На мой взгляд, самый простой и элегантный способ добиться того, что вам нужно:

ip route get 8.8.8.8 | tr -s ' ' | cut -d' ' -f7

ip route get [host] - дает вам шлюз, используемый для доступа к удаленному узлу, например:

8.8.8.8 via 192.168.0.1 dev enp0s3  src 192.168.0.109

tr -s ' ' - удаляет все лишние пробелы, теперь у вас есть однородность, например:

8.8.8.8 via 192.168.0.1 dev enp0s3 src 192.168.0.109

cut -d' ' -f7 - усекает строку в поле "разделенные пробелом", затем выбирает из нее поле # 7, например:

192.168.0.109

Ответ 11

Небольшое изменение одного из предыдущих решений ip route..., которое устраняет необходимость в grep:

ip route get 8.8.8.8 | sed -n 's|^.*src \(.*\)$|\1|gp'

Ответ 12

awk '/inet addr:/{gsub(/^.{5}/,"",$2); print $2}' file
192.168.1.103