Лучше избегать использования ifconfig
для получения IP-адреса в скрипте, поскольку он не рекомендуется в некоторых дистрибутивах (например, CentOS и других, больше не устанавливайте его по умолчанию).
В других системах вывод ifconfig варьируется в зависимости от выпуска дистрибутива (например, output / spacing / fields ifconfig
отличается от Debian 8 до Debian 9, например).
Для получения IP-адреса ip
аналогичным образом вы спрашиваете:
ip addr | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print "IP="$2 } '
Или еще лучше:
$ ip -o -4 address show | awk ' NR==2 { gsub(/\/.*/, "", $4); print $4 } '
192.168.1.249
Или, как вы спросите "IP ="
#!/bin/bash
echo -n "IP="
ip -o -4 address show | awk ' NR==2 { gsub(/\/.*/, "", $4); print $4 } '
Бесстыдно адаптирует идею от @Roman
$ ip -o -4 address show | awk ' NR==2 { gsub(/\/.*/, "", $4); print "IP="$4 } '
IP=192.168.1.249
Нормальный выход:
$ ip -o -4 address show
1: lo inet 127.0.0.1/8 scope host lo\ valid_lft forever preferred_lft forever
2: eth0 inet 192.168.1.249/24 brd 192.168.1.255 scope global eth0\ valid_lft forever preferred_lft forever
От man ip
:
-o, -oneline
выводит каждую запись в одну строку, заменяя перевод строки символом «\». Это удобно, когда вы хотите считать записи с помощью wc (1) или grep (1) вывода.
Посмотрите один пример того, почему ifconfig
это не рекомендуется: BBB: `bbb-conf --check`, показывающий IP-адреса как` inet` - горе ifconfig
Чтобы понять причину ifconfig
выхода, смотрите раздел Разница между командами 'ifconfig' и 'ip'
ifconfig
из net-tools, которые долгое время не могли полностью поддерживать сетевой стек Linux. Он также по-прежнему использует ioctl для настройки сети, что является уродливым и менее мощным способом взаимодействия с ядром.
Примерно в 2005 году был введен новый механизм управления сетевым стеком - сокеты netlink.
Для настройки сетевого интерфейса iproute2
используется механизм полнодуплексного сокета netlink, в то время как для него ifconfig
используется системный вызов ioctl.