Вы должны использоватьip
(вместо ifconfig
), так как он актуален, поддерживается и, возможно, наиболее важно для целей написания сценариев, он дает согласованный и разборчивый вывод. Ниже приведены несколько подобных подходов :
.
Если вам нужен адрес IPv4 для вашего интерфейса Etherneteth0
:
$ ip -4 -o addr show eth0 | awk '{print $4}'
192.168.1.166/24
Как сценарий:
$ INTFC=eth0
$ MYIPV4=$(ip -4 -o addr show $INTFC | awk '{print $4}')
$ echo $MYIPV4
192.168.1.166/24
Результат, полученный выше, представлен в нотации CIDR. Если нотация CIDR не нужна, ее можно удалить:
$ ip -4 -o addr show eth0 | awk '{print $4}' | cut -d "/" -f 1
192.168.1.166
Другой вариант, который ИМХО является «наиболее элегантным», — получение адреса IPv4 для любого интерфейса, используемого для подключения к указанному удаленному хосту (8.8.8.8 в данном случае ). Предоставлено @gatoatigrado в этот ответ:
$ ip route get 8.8.8.8 | awk '{ print $NF; exit }'
192.168.1.166
Как сценарий:
$ RHOST=8.8.8.8
$ MYIP=$(ip route get $RHOST | awk '{ print $NF; exit }')
$ echo $MYIP
192.168.1.166
Это прекрасно работает на хосте с одним интерфейсом, но более предпочтительно будет также работать на хостах с несколькими интерфейсами и/или спецификациями маршрута.
ip
был бы моим предпочтительным подходом, но это, конечно, не единственный способ освежевать эту кошку. Вот еще один подход, который использует hostname
, если вы предпочитаете что-то более простое/краткое:
$ hostname --all-ip-addresses | awk '{print $1}'
Или, если вам нужен адрес IPv6:
$ hostname --all-ip-addresses | awk '{print $2}'