Какая команда терминала получает только IP-адрес и ничего больше?

Я пытаюсь использовать только IP-адрес (inet) в качестве параметра в script, который я написал.

Есть ли простой способ в терминале unix получить только IP-адрес, а не просматривать ifconfig?

Ответ 1

Вы можете написать script, который возвращает только IP:

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

Для MAC:

ifconfig | grep "inet " | grep -v 127.0.0.1 | cut -d\  -f2

Или для Linux-системы

hostname -i | awk '{print $3}' # Ubuntu 

hostname -i # Debian

Ответ 2

Это даст вам все интерфейсы 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:]+'

Ответ 3

Как правило, никогда не гарантируется, что система будет иметь только один 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-адреса становится недетерминированным в случае, если установлены как кабельные, так и Wi-Fi-соединения, когда у машины более одного интерфейса Ethernet или когда присутствуют VPN-туннели.

Получение внешнего IP

Если вам нужен внешний IP-адрес, вы можете запросить службу в текстовом режиме, например, curl https://ipecho.net/plain вернет внешний IP-адрес в виде простого текста.

И еще более быстрый способ получить внешний IP-адрес - запросить известный DNS-сервер:

dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short

Ответ 4

hostname -I  

Эта команда даст вам точный IP-адрес, как вы хотите в Ubuntu.

Ответ 5

В последних версиях Ubuntu (14.04 - 16.04) эта команда сделала трюк для меня.

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

Ответ 6

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

ip -4 addr show dev eth0 | grep inet | tr -s " " | cut -d" " -f3 | head -n 1

Ответ 7

Чтобы получить только IP-адрес в Mac OS X, вы можете ввести следующую команду:

ipconfig getifaddr en0

Ответ 8

Мы можем просто использовать только 2 команды (ifconfig + awk), чтобы получить только тот IP-адрес (v4), который нам нужен:

В Linux, при условии получения IP-адреса из интерфейса eth0, выполните следующую команду:

/sbin/ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'

В OSX, предполагая получение IP-адреса из интерфейса en0, выполните следующую команду:

/sbin/ifconfig en0 | awk '/inet /{print $2}'

Чтобы узнать наш публичный/внешний IP-адрес, добавьте эту функцию в ~/.bashrc

whatismyip () {
    curl -s "http://api.duckduckgo.com/?q=ip&format=json" | jq '.Answer' | grep --color=auto -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"
}

Тогда беги, whatismyip

Ответ 9

Команда 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:]+'

Ответ 10

Мне нужно было что-то простое, которое работало как псевдоним Bash. Я обнаружил, что hostname -I работает лучше всего для меня (имя хоста v3.15). hostname -I по какой-либо причине возвращает loopback IP, но hostname -I дает мне правильный IP-адрес для wlan0 и без необходимости выводить выходные данные через grep или awk. Недостатком является то, что hostname -I выводит все IP-адреса, если у вас более одного.

Ответ 11

Это сделало бы трюк на Mac:

ping $(ifconfig en0 | awk '$1 == "inet" {print $2}')

Это разрешено для ping 192.168.1.2 на моей машине.

Pro tip: $(...) означает запустить все, что находится внутри круглых скобок в подоболочке, и вернуть это значение.

Ответ 12

В man hostname есть еще более простой способ, который автоматически исключает петлевой IP и отображает только список разделенных пробелами всех назначенных ip-адресов хоста:

[email protected]:~# hostname --all-ip-addresses
11.12.13.14 192.168.15.19 

[email protected]:~# 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

Ответ 13

Вы также можете использовать следующую команду:

ip route | grep src

ПРИМЕЧАНИЕ. Это будет работать только при наличии подключения к Интернету.

Ответ 14

Используйте следующую команду:

/sbin/ifconfig $(netstat -nr | tail -1 | awk '{print $NF}') | awk -F: '/inet /{print $2}' | cut -f1 -d ' '

Ответ 15

Вот моя версия, в которой вы можете передать список интерфейсов, упорядоченных по приоритету:

getIpFromInterface()
{
    interface=$1
    ifconfig ${interface}  > /dev/null 2>&1 && ifconfig ${interface} | awk -F'inet ' '{ print $2 }' | awk '{ print $1 }' | grep .
}

getCurrentIpAddress(){
    IFLIST=(${@:-${IFLIST[@]}})
    for currentInterface in ${IFLIST[@]}
    do
        IP=$(getIpFromInterface  $currentInterface)
        [[ -z "$IP" ]] && continue
    echo ${IP/*:}
    return
    done
}

IFLIST=(tap0 en1 en0)
getCurrentIpAddress [email protected]

Итак, если я подключен к VPN, Wifi и ethernet, мой VPN-адрес (на интерфейсе tap0) будет возвращен. script работает как с linux, так и с osx и может принимать аргументы, если вы хотите переопределить IFLIST

Обратите внимание, что если вы хотите использовать IPV6, вам придется заменить "inet" на "inet6".

Ответ 16

Я всегда нуждаюсь в этом в самые неожиданные моменты и, в случае необходимости, завершаю поиск таких потоков на SO. Поэтому я написал простой script для получения адресов 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 script выводит такой вывод:

$ echoip
public: 26.106.59.169
en0:    10.1.10.2

Ответ 17

используйте эту одну строку script: ifconfig | grep "inet " | grep -v 127.0.0.1|awk 'match($0, /([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/) {print substr($0,RSTART,RLENGTH)}' mac и linux (протестированы в ubuntu), оба работают.

Ответ 18

сетевой поиск * имя_хоста *

# net lookup localhost
127.0.0.1

Я думаю, это сработает для вас.

Ответ 19

ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'

показывает все ваши ips

Ответ 20

На Redhat 64bit, эта проблема решена для меня.

ifconfig $1|sed -n 2p|awk '{ print $2 }'|awk -F : '{ print $2 }'

Ответ 21

#!/bin/sh
# Tested on Ubuntu 18.04 and Alpine Linux 
# List IPS of following network interfaces:
# virtual host interfaces
# PCI interfaces
# USB interfaces
# ACPI interfaces
# ETH interfaces
for NETWORK_INTERFACE in $(ls /sys/class/net -al | grep -iE "(/eth[0-9]+$|vif|pci|acpi|usb)" | sed -E "[email protected]* ([^ ]*) ->.*@\[email protected]"); do 
    IPV4_ADDRESSES=$(ifconfig $NETWORK_INTERFACE | grep -iE '(inet addr[: ]+|inet[: ]+)' | sed -E "[email protected]\s*(inet addr[: ]+|inet[: ]+)([^ ]*) .*@\[email protected]")
    IPV6_ADDRESSES=$(ifconfig $NETWORK_INTERFACE | grep -iE '(inet6 addr[: ]+|inet6[: ]+)' | sed -E "[email protected]\s*(inet6 addr[: ]+|inet6[: ]+)([^ ]*) .*@\[email protected]")
    if [ -n "$IPV4_ADDRESSES" ] || [ -n "$IPV6_ADDRESSES" ]; then
        echo "NETWORK INTERFACE=$NETWORK_INTERFACE"
        for IPV4_ADDRESS in $IPV4_ADDRESSES; do 
            echo "IPV4=$IPV4_ADDRESS"
        done
        for IPV6_ADDRESS in $IPV6_ADDRESSES; do 
            echo "IPV6=$IPV6_ADDRESS"
        done
    fi
done

Ответ 22

При поиске вашего внешнего IP-адреса на хосте с NAT, довольно много ответов предлагают использовать методы на основе HTTP, такие как ifconfig.me например:

$ curl ifconfig.me/ip

За годы, которые я видел, как многие из этих сайтов приходят и уходят, я считаю этот метод на основе DNS более надежным:

$ dig +short myip.opendns.com @resolver1.opendns.com

У меня есть этот удобный псевдоним в моем ~/.bashrc:

alias wip='dig +short myip.opendns.com @resolver1.opendns.com'

Ответ 23

Чтобы напечатать только IP-адрес eth0, без другого текста:

ifconfig eth0 | grep -Po '(?<=inet )[\d.]+'

Чтобы определить ваш основной интерфейс (потому что это может быть не "eth0"), используйте:

route | grep ^default | sed "s/.* //"

Две вышеупомянутые строки можно объединить в одну команду, например:

ifconfig 'route | grep ^default | sed "s/.* //"' \
  | grep -Po '(?<=inet )[\d.]+'

Ответ 24

Похоже, что в немногих ответах используется более новая команда ip (замена для ifconfig), поэтому вот тот, который использует ip addr, grep и awk, чтобы просто напечатать адрес IPv4, связанный с интерфейсом wlan0 :

ip addr show wlan0|grep inet|grep -v inet6|awk '{print $2}'|awk '{split($0,a,"/"); print a[1]}'

Хотя это и не самое компактное или причудливое решение, его (возможно) легко понять (см. пояснение ниже) и изменить для других целей, таких как получение последних 3 октетов MAC-адреса, например:

ip addr show wlan0|grep link/ether|awk '{print $2}'|awk '{split($0,mac,":"); print mac[4] mac[5] mac[6]}'

Объяснение: ip addr show wlan0 выводит информацию, связанную с сетевым интерфейсом с именем wlan0, которая должна быть похожа на эту:

4: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether dc:a6:32:04:06:ab brd ff:ff:ff:ff:ff:ff
    inet 172.18.18.1/24 brd 172.18.18.255 scope global noprefixroute wlan0
       valid_lft forever preferred_lft forever
    inet6 fe80::d340:5e4b:78e0:90f/64 scope link 
       valid_lft forever preferred_lft forever

Далее grep inet отфильтровывает строки, которые не содержат "inet" (конфигурация IPv4 и IPv6), а grep -v inet6 отфильтровывает оставшиеся строки, которые содержат "inet6", что должно привести к одной строке, подобной этой один:

    inet 172.18.18.1/24 brd 172.18.18.255 scope global noprefixroute wlan0

Наконец, первый awk извлекает поле "172.18.18.1/24", а второй удаляет сокращенную маску сети, оставляя только адрес IPv4.

Кроме того, я думаю, что стоит упомянуть, что если вы пишете сценарии, то часто есть много более богатых и/или более надежных инструментов для получения этой информации, которые вы можете использовать вместо этого. Например, при использовании Node.js есть ipaddr-linux, при использовании Ruby есть linux-ip-parser и т.д.

Смотрите также https://unix.stackexchange.com/questions/119269/how-to-get-ip-address-using-shell-script

Ответ 25

curl ifconfig.co 

Это возвращает только IP-адрес вашей системы.

Ответ 26

Я бы использовал Hostname -L, чтобы получить только IP для использования в качестве переменной в script.