Linux bash script для извлечения IP-адреса
Я хочу сделать большой script на моем Debian 7.3 (что-то вроде переведенного и гораздо более нового удобного для пользователя окружения). У меня проблема. Я хочу использовать только некоторые данные, которые дают команды. Например, мой ifconfig выглядит так:
eth0 Link encap:Ethernet HWaddr 08:00:27:a3:e3:b0
inet addr:192.168.1.103 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fea3:e3b0/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1904 errors:0 dropped:0 overruns:0 frame:0
TX packets:2002 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1309425 (1.2 MiB) T
Я хочу отобразить только IP-адрес в строке: echo "Ваш IP-адрес: (IP_ADDRESS)". Есть ли какая-нибудь команда, которая позволяет мне делать такую вещь, искать в потоке информацию, которую я хочу получить?. Я знаю о grep
и sed
, но я не очень хорош с ними.
Изменить: во-первых, спасибо за помощь в решении этой проблемы, теперь я знаю гораздо больше. Во-вторых, проект идет. Если бы кто-нибудь был заинтересован в этом, просто меня.
Ответы
Ответ 1
Чтобы просто получить свой IP-адрес:
echo `ifconfig eth0 2>/dev/null|awk '/inet addr:/ {print $2}'|sed 's/addr://'`
Это даст вам IP-адрес eth0.
Изменить: из-за изменения имен интерфейсов в последних версиях Ubuntu это больше не работает. Вместо этого вы можете просто использовать это:
hostname --all-ip-addresses
или hostname -I
, что делает то же самое (дает вам ВСЕ IP-адреса хоста).
Ответ 2
Если цель состоит в том, чтобы найти IP-адрес, подключенный в направлении Интернета, то это должно быть хорошим решением.
ОБНОВИТЬ!!! С новой версией Linux вы получите больше информации на линии:
ip route get 8.8.8.8
8.8.8.8 via 10.36.15.1 dev ens160 src 10.36.15.150 uid 1002
cache
поэтому для получения IP нужно найти IP после src
ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}'
10.36.15.150
и если вам нравится имя интерфейса
ip route get 8.8.8.8 | awk -F"dev " 'NR==1{split($2,a," ");print a[1]}'
ens192
ip route
не открывает никакого соединения, он просто показывает маршрут, необходимый для перехода к 8.8.8.8
. 8.8.8.8
- это Google DNS.
Если вы хотите сохранить это в переменной, выполните:
my_ip=$(ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}')
my_interface=$(ip route get 8.8.8.8 | awk -F"dev " 'NR==1{split($2,a," ");print a[1]}')
Почему другое решение может дать сбой:
ifconfig eth0
- Если у вашего интерфейса есть другое имя (eno1, wifi, venet0 и т.д.)
- Если у вас более одного интерфейса
- IP-соединение не является первым в списке из более чем одного IF
Hostname -I
- Может получить только 127.0.1.1
- Не работает на всех системах.
Ответ 3
Если вы хотите получить список IP-адресов, разделенных пробелами, вы можете использовать команду hostname
с флагом --all-ip-addresses
(короткий -I
)
hostname -I
как описано здесь: Ввод IP-адреса в переменную bash. Есть ли лучший способ?
Ответ 4
ip -4 addr show eth0 | grep -oP "(?<=inet ).*(?=/)"
Ответ 5
Сделайте выбор:
$ cat file
eth0 Link encap:Ethernet HWaddr 08:00:27:a3:e3:b0
inet addr:192.168.1.103 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fea3:e3b0/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1904 errors:0 dropped:0 overruns:0 frame:0
TX packets:2002 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1309425 (1.2 MiB) T
$ awk 'sub(/inet addr:/,""){print $1}' file
192.168.1.103
$ awk -F'[ :]+' '/inet addr/{print $4}' file
192.168.1.103
Ответ 6
/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
Ответ 7
ip route get 8.8.8.8| grep src| sed 's/.*src \(.*\)$/\1/g'
Ответ 8
Может быть не для всех случаев (особенно если у вас несколько сетевых адаптеров), это поможет:
hostname -I | awk '{ print $1 }'
Ответ 9
Просто заметьте, так как я просто потратил некоторое время на устранение неудачного обновления на сервере.
Оказалось, что (несколько лет назад) я выполнил тест, чтобы увидеть, присутствовали ли динамически добавленные интерфейсы (например, eth0: 1), и если это так, я бы привязал определенную proggis к "главному" IP на eth0. В основном это был вариант решения "ifconfig | grep... | sed..." (плюс проверка наличия "eth0:" ).
Обновление принесло новые сетевые инструменты, и с ним результат немного изменился:
старый ifconfig:
eth0 Link encap:Ethernet HWaddr 42:01:0A:F0:B0:1D
inet addr:10.240.176.29 Bcast:10.240.176.29 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1460 Metric:1
...<SNIP>
тогда как новая версия отобразит это:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1460
inet 10.240.212.165 netmask 255.255.255.255 broadcast 10.240.212.165
...<SNIP>
рендеринг охоты на "eth0:", а также "inet addr:" поиск busted (неважно интерфейсы, называемые "em0", "br0" или "wlan0"...). Конечно, вы можете проверить "inet" (или "inet6" ) и сделать дополнительную часть addr: part, но, глядя ближе, вы увидите, что более или менее все изменилось, "Маска" теперь "netmask",...
Предложение "ip route..." довольно изящное - так возможно:
_MyIP="$( ip route get 8.8.8.8 | awk 'NR==1 {print $NF}' )"
if [ "A$_MyIP" == "A" ]
then
_MyIPs="$( hostname -I )"
for _MyIP in "$_MyIPs"
do
echo "Found IP: \"$_MyIP\""
done
else
echo "Found IP: $_MyIP"
fi
Что-то в этом роде. Поскольку все предлагаемые решения, похоже, имеют обстоятельства, в которых они терпят неудачу, проверьте возможные случаи краев - нет eth, multiple eth и lo's, когда будет "hostname -i" терпеть неудачу,... а затем принять решение о наилучшем решении, проверить его работу, иначе 2-й лучший.
Приветствия пива!
Ответ 10
На мой взгляд, самый простой и элегантный способ добиться того, что вам нужно:
ip route get 8.8.8.8 | tr -s ' ' | cut -d' ' -f7
ip route get [host]
- дает вам шлюз, используемый для доступа к удаленному узлу, например:
8.8.8.8 via 192.168.0.1 dev enp0s3 src 192.168.0.109
tr -s ' '
- удаляет все лишние пробелы, теперь у вас есть однородность, например:
8.8.8.8 via 192.168.0.1 dev enp0s3 src 192.168.0.109
cut -d' ' -f7
- усекает строку в поле "разделенные пробелом", затем выбирает из нее поле # 7, например:
192.168.0.109
Ответ 11
Небольшое изменение одного из предыдущих решений ip route...
, которое устраняет необходимость в grep:
ip route get 8.8.8.8 | sed -n 's|^.*src \(.*\)$|\1|gp'
Ответ 12
awk '/inet addr:/{gsub(/^.{5}/,"",$2); print $2}' file
192.168.1.103