Як я можу відобразити IP-адресу, показану на eth0, за допомогою сценарію?
Як я можу відобразити 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
Оновлення : якщо це не працює для вас, спробуйте іншу відповідь
grep "inet"
Для надання іншого варіанту ви можете використовувати ip addr
команду таким чином, щоб отримати IP-адресу:
ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
ip addr show eth0
показує інформацію про eth0
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)
Взято з /programming//a/14910952/1695680
hostname -i
Однак це може повернути локальну ip-адресу (127.0.0.1), тому вам, можливо, доведеться використовувати та фільтрувати:
hostname -I
Із керівництвом імені хоста:
-i, --ip-address
Відобразити мережеві адреси (адреси) імені хоста. Зауважте, що це працює лише в тому випадку, якщо ім'я хоста можна вирішити. Уникайте використання цієї опції; використовувати замість імені хоста --all-ip-адреси.
-I, --all-ip-addresses
Показати всі мережеві адреси хоста. Цей параметр перераховує всі налаштовані адреси на всіх мережевих інтерфейсах. Інтерфейс зворотного зв'язку та локальні адреси IPv6 посилань опущені. На відміну від параметра -i, ця опція не залежить від роздільної здатності імені. Не робіть жодних припущень щодо порядку виводу.
ip addr show label 'enp*'
краще, але мене дратує розбір, щось на кшталт ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2
може спрацювати ... як красиво
@ відповідь Маркуса-Ліндберга - моя улюблена. Якщо ви додасте -o -4
до прапорців ip, ви отримаєте набагато простіший (і послідовний) вихід:
ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'
-o
означає --oneline
, що має на меті допомогти в таких ситуаціях. Значення -4
додається для обмеження адреси IPv4, що означає всі інші відповіді.
ip
прапори. Використання, cut
а не просунуте awk
ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
cut
шлях після того, як я дізнався про це awk
, і мені подобається мінімізувати кількість команд на моїх трубопроводах. Приємна пропозиція в будь-якому випадку.
Ось кілька ліній .....
Awk
ifconfig eth0 | awk '/inet addr/{split($2,a,":"); print a[2]}'
функція split у наведеній вище команді awk розбиває другий стовпчик на основі роздільника :
і зберігає розділене значення в асоціативний масив a
. Так a[2]
утримується значення другої частини.
sed
ifconfig eth0 | sed -n '/inet addr/s/.*inet addr: *\([^[:space:]]\+\).*/\1/p'
В основному sed, що \(...\)
називається захоплюючою групою, яка використовується для захоплення персонажів. Ми могли б посилатись на захоплені символи шляхом зворотного посилання. \([^[:space:]]\+\)
фіксує будь-який символ, але не пробіл один або кілька разів.
греп
ifconfig eth0 | grep -oP 'inet addr:\K\S+'
\K
відкидає попередньо відповідні символи від друку на фіналі та \S+
відповідає одному або декільком символам, що не пробіл.
Perl
ifconfig eth0 | perl -lane 'print $1 if /inet addr:(\S+)/'
Один або кілька символів, що не знаходяться пробілом, розташовані поруч із inet addr:
рядком, фіксуються, і нарешті ми друкуємо лише ці захоплені символи.
Ви повинні використовувати ip
(замість ifconfig
), оскільки це поточне, що підтримується, і, можливо, найголовніше для сценаріїв, воно дає послідовний та прохідний вихід. Нижче наведено кілька подібних підходів:
Якщо ви хочете адресу 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
Інший варіант, що IMHO є "найелегантнішим", отримує 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
Я пропоную використовувати бібліотеку python як netiface, яка спеціально розроблена для цієї мети.
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]
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'
Це єдине використання, ip addr
яке є заміною ifconfig
та awk
поєднується із заміною (gsub).
Перестаньте використовувати занадто багато процесів для простих завдань
Ще один варіант, який може бути корисним, якщо у вас немає 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}"
ifconfig eth0|grep 'inet '|awk '{print $2}'
це може бути використано і для звичайного користувача.
ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
cut
двічі замість комбінації awk
та cut
для аналізу результатів. Наступного разу краще спершу ознайомитись з усіма іншими відповідями та переконатися, що ви не публікуєте дублікат рішення. У цьому випадку тут я думаю, що це суперечка, чи це дублікат чи просто подібне, тому, будь ласка, сприймайте це як загальну підказку. Спасибі.
Це найкоротший шлях, який я міг знайти:
ip -f inet addr show $1 | grep -Po 'inet \K[\d.]+'
Замініть $1
ваш мережевий інтерфейс.
ip -f inet
повідомляє ip повертати лише значення для сім'ї inet (ipv4).
grep -Po
вказує grep, щоб інтерперувати наступне значення як perl-регулярний вираз, і тільки друкувати відповідні значення.
У регулярному вираженні \K[\d.]+
сказано: "викиньте все до цього моменту (\ K) і зіставте якомога більше числових значень, за якими слідує крапка в ряд". Тому це буде відповідати лише IP-адресі та ігнорувати все після неї, включаючи маску підмережі shortform \ XX.
в ці дні з декількома інтерфейсами (наприклад, якщо ви використовуєте докер) та іменування інтерфейсу ETH вже не є нормами
Я використовую цю команду для отримання IP / Mask:
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, вона ніколи не виходить з ладу;)
ip
, використовуйте -o
параметр.
У своєму сценарії я використовую щось подібне:
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
Це не породить жодного процесу.