Как получить IP-адрес и имя подключенного интерфейса в Bash

411
xakepp35

ПК с встроенным Linux имеет несколько сетевых интерфейсов, например, две карты Ethernet и один адаптер Wi-Fi (номера и типы могут различаться). Каждый из этих интерфейсов может быть подключен к сети (и может быть отключен), а сеть может быть подключена к Интернету ( доступен сайт superuser.com ) и может быть подключена к локальной сети.

Я хочу написать bash-скрипт для получения (локального) IP-адреса и имени адаптера, который можно использовать для доступа в Интернет. Если несколько подключены - это должен быть тот, который будет использоваться браузером, который «запрашивается» для загрузки веб-страниц superuser.com . Если подключенный скрипт не долженecho "internet unavailble"

Как написать условие проверки для такого скрипта? Как я мог бы перебрать все устройства с поддержкой сети /dev/*в системе?

2
@KamilMaciorowski Я думаю, что вы неправильно прочитали вопрос. Я попросил метод итерации. Мне не нужны маршруты и схемы, я хочу знать .. подстановочный знак для устройств. я не могу поместить туда / dev / eth *, потому что интерфейс может быть назван enp3s0, например, или это может быть адаптер Wi-Fi или сетевой адаптер USB. xakepp35 5 лет назад 1
Каждый абзац в вашем вопросе требует совершенно другой вещи. "Как мне получить имя интерфейса по умолчанию?" «Подождите, нет, я не хочу интерфейс по умолчанию, я хочу все интерфейсы» ... (удаленное) сообщение сделало _точно_ то, что требует 2-й абзац вашего вопроса. grawity 5 лет назад 0
Является ли ваш основной вопрос, что вы хотите команду, которую вы можете запустить локально, которая сообщит вам, какой интерфейс будет направлять трафик в Интернет? Hogstrom 5 лет назад 0
@ xakepp35 браузер не решает, какой сетевой интерфейс использовать, способ отправки пакетов определяется таблицей маршрутизации. AnonymousLurker 5 лет назад 0
@AnonymousLurker Конечно. Я написал так для простоты формулировки. Если вам не нравится «браузер», я могу заменить его командой «ping» или чем-то еще. xakepp35 5 лет назад 0

1 ответ на вопрос

3
Kamil Maciorowski

Может быть, вам не нужно повторять. В моем Debian 9 (только IPv4, я не уверен, насколько это актуально) я могу использовать это:

ip route get "$(host superuser.com | awk 'NR==1 ')" \ | grep -o "dev .* src [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" 

где host(из bind9-hostпакета) - конвертировать superuser.comв его IP-адрес. Для обработки ошибок и т. Д. Вам необходимо деконструировать канал и построить скрипт с некоторой логикой вокруг его частей.

Пример вывода:

dev wlan0 src 192.168.1.2 

Чтобы все повторить, загляните в /sys/class/net:

cd /sys/class/net ls for interface in *; do printf "Doing something with %s\n" "$interface" done 

Эти устройства не находятся под, /devхотя, по крайней мере, ни в одной из моих систем.

Более того, добавив `awk ''` GAD3R 5 лет назад 0
Спасибо, я думаю, мне нужен первый вариант. Я хочу назначить некоторый «идентификатор устройства» компьютеру, основываясь на шестнадцатеричных цифрах его локального IP-адреса. Это должен быть IP-адрес его адаптера, который будет использоваться для доступа в Интернет. Машина может иметь несколько адаптеров, даже разных типов, поэтому я должен выбрать правильный. Также я должен позаботиться и предупредить местного администратора, если никакие адаптеры не могут подключиться к Интернету во время выполнения скрипта. xakepp35 5 лет назад 0