Как я могу отобразить IP-адрес, показанный на eth0 с помощью сценария?
сохраните это в файле и затем работайте bash <filename>
#!/bin/bash
ifconfig eth0 | grep "inet addr"
являющийся больше с точностью до, получают только число, показывающее IP-адрес:
#!/bin/bash
ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1
Обновление : Если это не делает работ для Вас, попробуйте другой ответ
Это - самый короткий способ, которым я мог найти:
ip -f inet addr show $1 | grep -Po 'inet \K[\d.]+'
Замена $1
с Вашим сетевым интерфейсом.
ip -f inet
говорит IP только возвращать значения для inet (ipv4) семейство.
grep -Po
говорит grep interperate следующее значение как perl-regex, и только распечатайте совпадающие значения.
regex \K[\d.]+
говорит, "выбрасывают все до этой точки (\K), и соответствие как можно больше числовых значений, сопровождаемых точкой подряд". Это будет поэтому только соответствовать IP-адресу и игнорировать все после него, включая краткую форму \XX маска подсети.
это может использоваться с обычным пользователем также.
ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
Вот хороший, только grep использования как вторичная команда:
IP addr показывают eth0 | grep-oP 'inet \K\S [0-9]. +'
я не вижу, почему необходимо использовать больше команд, чем необходимый
Просто еще одна опция, которая может быть полезной, если у Вас нет awk (поскольку это имеет место в некоторых встроенных устройствах):
ip addr show dev eth0 scope global | grep "inet\b" | cut -d/ -f 1 | egrep -o "([[:digit:]]{1,3}[.]{1}){3}[[:digit:]]{1,3}"
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'
Это единственное использование ip addr
, который является заменой для ifconfig
и awk
объединенный с заменой (gsub).
Остановка, используя слишком много процессов для простых задач
Вот некоторые остроты.....
функция разделения Awk
ifconfig eth0 | awk '/inet addr/{split($2,a,":"); print a[2]}'
в вышеупомянутом awk команда разделяет второй столбец на основе разделителя :
и хранит значение splitted в ассоциативный массив a
. Так a[2]
содержит значение второй части.
sed
ifconfig eth0 | sed -n '/inet addr/s/.*inet addr: *\([^[:space:]]\+\).*/\1/p'
В основном sed, \(...\)
названный группой фиксации, которая используется для получения символов. Мы могли отослать те полученные символы посредством ссылки спины. \([^[:space:]]\+\)
получения любой символ, но не пространство один или несколько раз.
grep
ifconfig eth0 | grep -oP 'inet addr:\K\S+'
\K
отбрасывает ранее подобранные символы от печати в финале и \S+
соответствия один или несколько непробелов.
Perl
ifconfig eth0 | perl -lane 'print $1 if /inet addr:(\S+)/'
Один или несколько непробелов, которые являются рядом с эти inet addr:
строка, получены, и наконец мы печатаем те полученные символы только.
@markus-lindberg ответ является моим фаворитом. Если Вы добавляете -o -4
к флагам IP затем, Вы получаете намного более легко parsable (и последовательный) вывод:
ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'
-o
обозначает --oneline
, который предназначен для помощи в точно этом виде ситуаций. Эти -4
добавляется для ограничения адресом IPv4, который является тем, что подразумевают все другие ответы.
Взятый от https://stackoverflow.com/a/14910952/1695680
hostname -i
Однако, который может возвратить локальный IP-адрес (127.0.0.1), таким образом, Вам, вероятно, придется использовать, и фильтр:
hostname -I
Из страниц справочника имени хоста:
-i, --ip-address
Дисплей сетевой адрес (адреса) имени хоста. Обратите внимание, что это работает, только если имя хоста может быть разрешено. Избегайте использования этой опции; используйте имя хоста - все-IP-адреса вместо этого.
-I, --all-ip-addresses
Дисплей все сетевые адреса хоста. Эта опция перечисляет все настроенные адреса во всей сети inter‐faces. Петлевой интерфейс и IPv6 локальные для ссылки адреса опущены. Вопреки опции-i, эта опция не зависит от определения имен. Не делайте предположения о порядке вывода.
Ради предоставления другой возможности Вы могли использовать эти ip addr
команда этот способ получить IP-адрес:
ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
ip addr show eth0
информация о шоу [приблизительно 114] grep "inet\b"
только шоу строка, которая имеет адрес IPv4 (если Вы хотели адрес IPv6, измените его на "inet6\b"
) awk '{print $2}'
печать на втором поле, которое имеет ipaddress/mask, пример 172.20.20.15/25
cut -d/ -f1
только берет часть IP-адреса. В сценарии:
#!/bin/bash
theIPaddress=$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)
Я предлагаю пользоваться библиотекой Python как netifaces, который специально предназначен с этой целью.
sudo pip install netifaces
python -c "import netifaces; print netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr']"
Получить интерфейс стандартной сети, который используется.
default_inf = netifaces.gateways()['default'][netifaces.AF_INET][1]
в эти дни с интерфейсами кратных чисел (например, если Вы используете докера) и называющий интерфейс ETH не больше нормы
Я использую эту команду для извлечения IP/маски:
IPMASK=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6)
Так безотносительно, сколько интерфейсов я буду иметь и безотносительно их имени, GREP только захватит первое наличие опции MULTICAST.
Я использую эту команду для извлечения только IP без маски:
IP=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6|cut -d'/' -f1)
Я использую, они управляют на другой BDS & NIX, которую это никогда не приводит к сбою ;)
вот для IPv4:
ip -f inet a|grep -oP "(?<=inet ).+(?=\/)"
вот для IPv4 и конкретного dev (eth0):
ip -f inet a show eth0|grep -oP "(?<=inet ).+(?=\/)"
для IPv6:
ip -6 -o a|grep -oP "(?<=inet6 ).+(?=\/)"
ifconfig eth0|grep 'inet '|awk '{print $2}'
Необходимо использовать ip
(вместо ifconfig
) поскольку это является текущим, сохраняется, и возможно самое главное для сценариев целей, это производит последовательный и parsable вывод. Следующее является несколькими аналогичными подходами:
Если Вы хотите адрес IPv4 для своего интерфейса Ethernet eth0
:
$ 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}'
Как сценарий:
$ MYV4IP=$(hostname --all-ip-addresses | awk '{print $1}')
$ MYV6IP=$(hostname --all-ip-addresses | awk '{print $2}')
$ echo $MYV4IP
192.168.1.166
$ echo $MYV6IP
2601:7c1:103:b27:352e:e151:c7d8:3379
В моем сценарии я использую что-то как этот:
re="inet[[:space:]]+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)"
if [[ $(ip addr show eth0) =~ $re ]]; then
echo ${BASH_REMATCH[1]}
else
echo "Cannot determin IP" 1>&2
fi
Это не порождает процесса.
Еще один путь (принимающий Вас не хотят a CIDR
обратитесь и хотите IPv4
):
$ ip -br -4 addr show dev eth0 | awk '{split($3,a,"/"); print a[1]}'
ip
команда, которая не является deprecated