Какая команда терминала должна получить только IP-адрес и ничего больше?
Я пытаюсь использовать только IP-адрес (inet) в качестве параметра в скрипте, который я написал.
есть ли простой способ в терминале unix получить только IP-адрес, а не просматривать ifconfig
?
21 ответ:
вы можете написать скрипт, который возвращает только IP, например:
/sbin/ifconfig eth0 | grep 'inet addr' | cut -d: -f2 | awk '{print }'
для MAC:
ifconfig | grep "inet " | grep -v 127.0.0.1 | cut -d\ -f2
или для системы linux
hostname -i | awk '{print }' # Ubuntu hostname -i # Debian
как правило, никогда не гарантируется, что система будет иметь только один IP-адрес, например, вы можете иметь как ethernet, так и wlan-соединения, и если у вас есть активное VPN-соединение, то у вас будет еще один IP-адрес.
Linux
В Linux
hostname -I
будет отображаться текущий IP-адрес (ы). Полагаясь на то, что он всегда возвращает только один IP-адрес, скорее всего, не будет работать так, как ожидалось в некоторых сценариях (т. е. VPN-ссылка включена), поэтому более надежный способ будет преобразуйте результат в массив, а затем выполните цикл по элементам:ips=($(hostname -I)) for ip in "${ips[@]}" do echo $ip done
OSX
на OSX, если вы знаете интерфейса, вы могли бы использовать:
~$ ipconfig getifaddr en0 192.168.1.123
что вернет просто IP-адрес.
или вы можете перебирать возможные имена интерфейсов, начиная с суффикса, т. е.
en
:for NUMBER in $(seq 0 5); do ip=`ipconfig getifaddr en$NUMBER` if [ -n "$ip" ]; then myip="$ip" break fi done echo $myip
кроме того, получение IP-адреса становится недетерминированным в случае подключения кабеля и wifi устанавливаются, когда машина имеет несколько интерфейсов ethernet, или когда присутствуют VPN-туннели.
получение внешнего IP
Если вам нужен внешний IP, то вы можете запросить в текстовом режиме, например
curl ipecho.net/plain
возвращает обычный текст внешний IP.
это даст вам все интерфейсы IPv4, включая loopback 127.0.0.1:
ip -4 addr | grep -oP '(?<=inet\s)\d+(\.\d+){3}'
это покажет только
eth0
:ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'
и таким образом, вы можете получить IPv6-адреса:
ip -6 addr | grep -oP '(?<=inet6\s)[\da-f:]+'
только
eth0
IPv6:ip -6 addr show eth0 | grep -oP '(?<=inet6\s)[\da-f:]+'
на последний Ubuntu версиях (14.04-16.04), эта команда сделала трюк для меня.
hostname -I | awk '{print }'
Если у вас ограниченная среда, Вы можете использовать эту команду:
ip -4 addr show dev eth0 | grep inet | tr -s " " | cut -d" " -f3 | head -n 1
команда
ifconfig
является устаревшим, и вы должны использоватьip
команда на Linux.и
ip a
даст вам область на той же линии, что и IP, поэтому ее проще использовать.эта команда покажет вам ваш глобальный (внешний) IP-адрес:
ip a | grep "scope global" | grep -Po '(?<=inet )[\d.]+'
все IPv4 (также 127.0.0.1):
ip a | grep "scope" | grep -Po '(?<=inet )[\d.]+'
все IPv6 (также ::1):
ip a | grep "scope" | grep -Po '(?<=inet6 )[\da-z:]+'
чтобы получить только IP-адрес на Mac OS X вы можете ввести следующую команду:
ipconfig getifaddr en0
мы можем просто использовать только 2 команды (ifconfig + awk), чтобы получить только IP (v4) мы хотим так:
на Linux, предполагая получить IP-адрес от
eth0
интерфейс, выполните следующую команду:/sbin/ifconfig eth0 | awk '/inet addr/{print substr(,6)}'
на OSX, предполагая получить IP-адрес от
en0
интерфейс, выполните следующую команду:/sbin/ifconfig en0 | awk '/inet /{print }'
Я хотел что-то простое, что работало как псевдоним Bash. Я нашел это
hostname -I
лучше всего работает для меня (имя хоста v3. 15).hostname -i
возвращает loopback IP, по какой-то причине, ноhostname -I
дает мне правильный IP для wlan0,и без необходимости передавать вывод через grep или awk. Недостатком является то, чтоhostname -I
выводит все IPs, если у вас есть более одного.
что бы сделать трюк в Mac:
ping $(ifconfig en0 | awk ' == "inet" {print }')
что решил
ping 192.168.1.2
в моей машине.совет:
$(...)
означает выполнить все, что находится внутри круглых скобок в подобласти и вернуть это как значение.
используйте следующую команду:
/sbin/ifconfig $(netstat -nr | tail -1 | awk '{print $NF}') | awk -F: '/inet /{print }' | cut -f1 -d ' '
вот моя версия, в которой вы можете передать список интерфейсов, упорядоченных по приоритету:
getIpFromInterface() { interface= ifconfig ${interface} > /dev/null 2>&1 && ifconfig ${interface} | awk -F'inet ' '{ print }' | awk '{ print }' | grep . } getCurrentIpAddress(){ IFLIST=(${@:-${IFLIST[@]}}) for currentInterface in ${IFLIST[@]} do IP=$(getIpFromInterface $currentInterface) [[ -z "$IP" ]] && continue echo ${IP/*:} return done } IFLIST=(tap0 en1 en0) getCurrentIpAddress $@
поэтому, если я подключен к VPN, Wifi и ethernet, мой адрес VPN (на интерфейсе tap0) будет возвращен. Скрипт работает как на linux, так и на osx, и может принимать аргументы, если вы хотите переопределить IFLIST
обратите внимание, что если вы хотите Использовать IPV6, вам придется заменить 'inet' на 'inet6'.
Я всегда нуждаюсь в этом в самые неожиданные моменты и, в обязательном порядке, заканчиваю поиск таких нитей на SO. Поэтому я написал простой скрипт для получения IPv4 адресов через netstat, называемый
echoip
-вы можете найти его здесь. Bash для сетевых адресов выглядит так, он также получает ваш публичный адрес от ipecho.net:IPV4='\d+(\.\d+){3}' INTERFACES=`netstat -i | grep -E "$IPV4" | cut -d ' ' -f 1` INTERFACE_IPS=`netstat -i | grep -oE "$IPV4"` for i in "${!INTERFACES[@]}"; do printf "%s:\t%s\n" "${INTERFACES[$i]}" "${INTERFACE_IPS[$i]}" done
The
echoip
скрипт выдает такой результат:$ echoip public: 26.106.59.169 en0: 10.1.10.2
используйте этот сценарий одной строки:
ifconfig | grep "inet " | grep -v 127.0.0.1|awk 'match(, /([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/) {print substr(,RSTART,RLENGTH)}'
mac & linux (проверено в ubuntu) оба работает.
на
man hostname
есть еще более простой способ, который автоматически исключает loopback IP и показывает только разделенный пробелом список всех назначенных IP-адресов хоста:root@srv:~# hostname --all-ip-addresses 11.12.13.14 192.168.15.19 root@srv:~# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: venet0: <BROADCAST,POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN link/void inet 11.12.13.14/32 scope global venet0:0 inet 192.168.15.19/32 scope global venet0:1
на Redhat 64bit, это решило проблему для меня.
ifconfig |sed -n 2p|awk '{ print }'|awk -F : '{ print }'