Какая команда терминала для получения только 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
- это deprected и вы должны использовать 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
в моей машине.
Pro tip: $(...)
означает запуск всего, что находится внутри круглых скобок в подрешетке, и возвращает это значение.
используйте следующую команду:
/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
на 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 }'
вы также можете использовать следующую команду:
ip route | grep src
Примечание: это будет работать только если у вас есть подключение к интернету.
Я бы использовал Hostname -L
чтобы получить только IP для использования в качестве переменной в скрипте.