Я пытаюсь использовать только IP-адрес (inet) в качестве параметра в сценарии, который я написал.
Есть ли простой способ в терминале unix получить только IP-адрес, а не просматривать ifconfig
?
Я пытаюсь использовать только IP-адрес (inet) в качестве параметра в сценарии, который я написал.
Есть ли простой способ в терминале unix получить только IP-адрес, а не просматривать ifconfig
?
Вы можете написать скрипт, который возвращает только IP-адрес, например:
/sbin/ifconfig eth0 | grep 'inet addr' | cut -d: -f2 | awk '{print $1}'
Для МАК:
ifconfig | grep "inet " | grep -v 127.0.0.1 | cut -d\ -f2
Или для системы Linux
hostname -i | awk '{print $3}' # Ubuntu
hostname -i # Debian
hostname -i
на моем он возвращает: ::1 127.0.1.1 192.168.1.100
- person Book Of Zeus; 16.12.2011
hostname
не переносимо.
- person Timofey Stolbov; 16.12.2011
hostname
не работает на Mountain Lion для этой задачи. Страница man
говорит, что принимает только флаги [-fs]
, которые, честно говоря, здесь бесполезны...
- person Matt; 16.08.2013
cut -d/
у меня работает (косая черта). не обратная косая черта
- person mr5; 18.05.2017
adr
вместо addr
.
- person Rohlik; 07.07.2020
/sbin/ifconfig eth0 | grep 'inet adr' | cut -d: -f2 | awk '{print $1}'
вместо /sbin/ifconfig eth0 | grep 'inet addr' | cut -d: -f2 | awk '{print $1}'
.
- person Rohlik; 10.07.2020
man hostname
, вы увидите, что в настоящее время вы должны говорить hostname --all-ip-addresses
в Linux. Это напечатает все IP-адреса, которые вы разделили пробелами. Если вы не используете несколько сетевых адаптеров или виртуальную сеть, вы получите только один IP-адрес.
- person Mikko Rantalainen; 17.12.2020
$ hostname --all-ip-addresses | sed '1s/[^ \t]//g' |wc -c
результат: 10
- person Book Of Zeus; 17.01.2021
hostname --all-ip-addresses
?
- person Mikko Rantalainen; 20.01.2021
hostname --all-ip-addresses
недостаточно. Итак, вывод этой команды: 10.0.0.18 172.22.0.1 172.19.0.1 172.20.0.1 172.18.0.1 172.21.0.1 172.17.0.1 172.23.0.1 192.168.42.1 etc....
- person Book Of Zeus; 27.01.2021
2
, так что он считает по крайней мере один за другим. Выполнение чего-то вроде hostname --all-ip-addresses | xargs -rn1 echo | wc -l
или hostname --all-ip-addresses | grep -o ' ' | wc -l
должно выдать правильное число.
- person Mikko Rantalainen; 27.01.2021
-I
/--all-ip-addresses
на справочной странице hostname(1)
: Do not make any assumptions about the order of the output.
- person kevmitch; 12.06.2021
Это даст вам все интерфейсы 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:]+'
grep -oP
на busybox v1.24.1: недопустимая опция -- P
- person Pro Backup; 18.08.2016
-P
для регулярных выражений Perl, иначе мы не сможем использовать токен lookbehind (?<=inet\s)
. Вы можете получить аналогичный результат, запустив grep -oe 'inet [0-9\.]\+'
или grep -oe 'inet6 [0-9a-f:]\+'
, но таким образом я не могу избавиться от первого слова. В SuSE man grep
сообщает, что флаг -P
является экспериментальным.
- person Jorge Bellon; 08.03.2019
ip -4 a show eth0 | grep -Po 'inet \K[0-9.]*'
- person tukusejssirs; 19.01.2020
Как правило, никогда не гарантируется, что система будет иметь только один IP-адрес, например, вы можете иметь как Ethernet-, так и WLAN-подключения, а если у вас есть активное VPN-подключение, у вас будет еще один IP-адрес.
В Linux hostname -I
будет отображать текущие IP-адреса. Полагаться на то, что он всегда возвращает только один IP-адрес, скорее всего, не будет работать должным образом в некоторых сценариях (например, соединение VPN установлено, несколько адаптеров Ethernet и т. д.), поэтому более надежным способом было бы преобразование результата в массив, а затем зацикливание над элементами:
ips=($(hostname -I))
for ip in "${ips[@]}"
do
echo $ip
done
Примечание. Если
hostname -I
возвращает IP-адрес как в формате IPv4, так и в формате IPv6, вы можете использовать вместо негоhostname -I | cut -f1 -d' '
, чтобы показать только IP-адрес IPv4.
В 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-адрес, вы можете запросить службу текстового режима, например, curl https://ipecho.net/plain
вернет обычный текстовый внешний IP-адрес.
Более быстрая альтернатива — запросить известный DNS-сервер, например:
dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short
hostname -I | xargs -rn1 echo
.
- person Mikko Rantalainen; 17.12.2020
hostname -I
Эта команда даст вам точный IP-адрес, который вы хотите в Ubuntu.
В последних версиях Ubuntu (14.04–16.04) эта команда помогла мне.
hostname -I | awk '{print $1}'
print $1
может дать вам правильный результат, а может и нет.
- person 9769953; 22.07.2019
Чтобы получить только IP-адрес в Mac OS X, введите следующую команду:
ipconfig getifaddr en0
Если у вас ограниченная среда, вы можете использовать эту команду:
ip -4 addr show dev eth0 | grep inet | tr -s " " | cut -d" " -f3 | head -n 1
ip -o -4 addr show dev eth0 | cut -d' ' -f7 | cut -d'/' -f1
- person Jose Alban; 10.04.2018
ip -4 addr show eth0 | grep inet | awk '{print $2}' | cut -d'/' -f1
. Как для v4, так и для v6: ip addr show eth0 | grep inet | awk '{print $2}' | cut -d'/' -f1
- person Sumit Murari; 01.06.2019
ip -4 addr show eth0 | grep inet
выполните: ip -4 addr show | grep 192
- person cyberbird; 05.02.2020
ip -4 address show eth0 | awk '/inet/{split($2,a,"/");print a[1];exit}'
- person sparks; 13.07.2021
Команда 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:]+'
Мы можем просто использовать только 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
Похоже, что в нескольких ответах используется более новая команда 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 < a href="https://github.com/mabels/linux-ip-parser" rel="nofollow noreferrer">linux-ip-parser
и т. д.
См. также https://unix.stackexchange.com/questions/119269/how-to-get-ip-address-using-shell-script
Чтобы напечатать только IP-адрес eth0
без другого текста:
ifconfig eth0 | grep -Po '(?<=inet addr:)[\d.]+'
Чтобы определить ваш основной интерфейс (поскольку это может быть не eth0), используйте:
route | grep ^default | sed "s/.* //"
Вышеуказанные две строки можно объединить в одну команду следующим образом:
ifconfig `route | grep ^default | sed "s/.* //"` \
| grep -Po '(?<=inet addr:)[\d.]+'
Я хотел что-то простое, что работало бы как псевдоним Bash. Я обнаружил, что для меня лучше всего подходит hostname -I
(имя хоста v3.15). hostname -i
по какой-то причине возвращает петлевой IP-адрес, но hostname -I
дает мне правильный IP-адрес для wlan0 и без необходимости передавать вывод через grep или awk. Недостатком является то, что hostname -I
выводит все IP-адреса, если их несколько.
Я всегда нуждаюсь в этом в самые неожиданные моменты и, в обязательном порядке, ищу такие темы на SO. Поэтому я написал простой скрипт для получения IPv4-адресов через netstat под названием echoip
— вы можете найти его здесь. Баш для сетевых адресов выглядит так, он также получает ваш публичный адрес от 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
Это сделало бы трюк на Mac:
ping $(ifconfig en0 | awk '$1 == "inet" {print $2}')
Это решило ping 192.168.1.2
на моей машине.
Совет: $(...)
означает запуск всего, что находится внутри круглых скобок, в подоболочке и возврат его в качестве значения.
В 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
Вы также можете использовать следующую команду:
ip route | grep src
ПРИМЕЧАНИЕ. Это будет работать, только если у вас есть подключение к Интернету.
Я предпочитаю не использовать awk
и тому подобное в скриптах. ip
имеет возможность вывода в JSON.
Если вы пропустите $interface
, вы получите все IP-адреса:
ip -json addr show $interface | \
jq -r '.[] | .addr_info[] | select(.family == "inet") | .local'
bash ip -j addr show eth0 | jp "[0].addr_info[?family== 'inet'].local | [0]"
- person Jack Liu Shurui; 27.07.2020
Используйте следующую команду:
/sbin/ifconfig $(netstat -nr | tail -1 | awk '{print $NF}') | awk -F: '/inet /{print $2}' | cut -f1 -d ' '
Вот моя версия, в которой вы можете передать список интерфейсов, отсортированных по приоритету:
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 $@
Поэтому, если я подключен к VPN, Wi-Fi и Ethernet, мой VPN-адрес (на интерфейсе tap0) будет возвращен. Скрипт работает как на Linux, так и на OSX и может принимать аргументы, если вы хотите переопределить IFLIST.
Обратите внимание: если вы хотите использовать IPV6, вам придется заменить «inet» на «inet6».
используйте этот однострочный скрипт:
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) оба работают.
ifconfig en0
или ifconfig eth1
и т. д., если вы знаете, какой интерфейс вам нужен :)
- person jaygooby; 10.11.2017
Я пока не вижу ответа с nmcli
, который является инструментом командной строки для управления NetworkManager.
Так вот :)
wolf@linux:~$ nmcli device
DEVICE TYPE STATE CONNECTION
eth1 ethernet unavailable --
eth0 ethernet unmanaged --
lo loopback unmanaged --
wolf@linux:~$
Если вы хотите получить информацию от определенного сетевого интерфейса (скажем, lo
для этого примера)
wolf@linux:~$ nmcli device show lo
GENERAL.DEVICE: lo
GENERAL.TYPE: loopback
GENERAL.HWADDR: 00:00:00:00:00:00
GENERAL.MTU: 65536
GENERAL.STATE: 10 (unmanaged)
GENERAL.CONNECTION: --
GENERAL.CON-PATH: --
IP4.ADDRESS[1]: 127.0.0.1/8
IP4.GATEWAY: --
IP4.ROUTE[1]: dst = 127.0.0.0/8, nh = 0.0.0.0,>
IP4.ROUTE[2]: dst = 127.0.0.1/32, nh = 0.0.0.0>
IP6.ADDRESS[1]: ::1/128
IP6.GATEWAY: --
IP6.ROUTE[1]: dst = ::1/128, nh = ::, mt = 256
IP6.ROUTE[2]: dst = ::1/128, nh = ::, mt = 0, >
wolf@linux:~$
Но так как вы просто хотите получить IP-адрес, просто отправьте вывод на grep
, cut
или awk
.
Давайте сделаем это шаг за шагом. (Не уверен, что не так, формат образца кода просто не работал для этих трех примеров.)
Получить линию IPv4
wolf@linux:~$ nmcli устройство показать вот | grep 4.A IP4.АДРЕС[1]: 127.0.0.1/8 wolf@linux:~$
Используйте awk
, чтобы получить IP
wolf@linux:~$ nmcli устройство показать вот | awk '/4.A/ {print $2}' 127.0.0.1/8 wolf@linux:~$
Используйте cut
для удаления обозначения CIDR (/8)
wolf@linux:~$ nmcli устройство показать вот | awk '/4.A/ {print $2}' | вырезать -d / -f1 127.0.0.1 wolf@linux:~$
Там твой ответ.
Обратите внимание, что существует множество способов сделать это с помощью инструментов, которые я только что продемонстрировал.
Давайте повторим команды, которые я использовал.
nmcli device show lo | grep 4.A
nmcli device show lo | awk '/4.A/ {print $2}'
nmcli device show lo | awk '/4.A/ {print $2}' | cut -d / -f1
Пример вывода для этих 3 команд
Выход команды 1
IP4.ADDRESS[1]: 127.0.0.1/8
Вывод команды 2
127.0.0.1/8
Вывод команды 3
127.0.0.1
nmcli -g IP4.ADDRESS device show lo | cut -d / -f 1
- person Jean Spector; 16.12.2020
IPv4-адрес для маршрута по умолчанию:
ip address show $(ip route | grep "^default " | head -n1 | grep -Po "(?<=dev )[^ ]+") | grep -Po "(?<=inet )[^ /]+"
IPv6-адрес для маршрута по умолчанию:
ip address show $(ip route | grep "^default " | head -n1 | grep -Po "(?<=dev )[^ ]+") | grep -Po "(?<=inet6 )[^ /]+"
Для них требуются только команды ip
и grep
с поддержкой -P
и -o
. head -1
требуется, потому что ip route
может отображать несколько маршрутов по умолчанию, когда система имеет достаточно сложную настройку сети.
Если вы не возражаете, какой IP-адрес, вы можете просто сделать
ip route | grep -Po '(?<=src )[^ ]+'
or
hostname --all-ip-addresses
grep -Po
на sed
или awk
, если существует какая-то система, которая поддерживает команду ip
, но не grep -Po
. grep -Po
не определяется POSIX... но POSIX не определяет никаких сетевых команд, поэтому вы не можете сделать это только с помощью инструментов POSIX.
- person Mikko Rantalainen; 17.12.2020
самый простой способ, как сказал Микко
hostname --all-ip-addresses
вы также можете сделать это для более подробной информации:
ip route
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'
показывает все ваши ips
На Redhat 64bit это решило проблему для меня.
ifconfig $1|sed -n 2p|awk '{ print $2 }'|awk -F : '{ print $2 }'
При поиске вашего внешнего 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'
Эти два способа сработали для меня:
Чтобы получить IP-адрес вашего интерфейса eth0. Замените eth0 в приведенном ниже примере на имя вашего интерфейса. ifconfig eth0 | grep -w "inet" | tr -s " " | cut -f3 -d" "
Использование имени хоста: это даст вам инет, т. е. IP-адрес вашего это. используя -I дам вам значение inet для всех интерфейсов, где бы это значение ни присутствовало.
hostname -i
Если вы не хотите использовать ifconfig
или регулярное выражение...
ip addr | grep eth0 | grep inet | awk '{print $2}' | cut -d"/" -f1
ip adddr, короткий путь
ip -4 -br addr show enp1s0 | awk -F" " '{print $3}'|cut -d'/' -f1
или сократить
ip -4 -br a s enp1s0 | awk -F" " '{print $3}'|cut -d'/' -f1
должен работать в большинстве современных дистрибутивов Linux
Я бы использовал Hostname -L
, чтобы получить только IP-адрес для использования в качестве переменной в сценарии.
hostname -i
или hostname -I
?
- person jlh; 24.05.2018
user@linux:~$ Hostname -L -bash: Hostname: command not found user@linux:~$
1. Заглавная H
неверна 2. Нет такой -L
- person ; 17.01.2019
curl ifconfig.co
Это возвращает только IP-адрес вашей системы.
ip -o address
гораздо проще работать, чем с выводомip address
. - person jlh   schedule 24.05.2018