Как получить шлюз по умолчанию в Mac OSX

119

Мне нужно получить шлюз по умолчанию на компьютере Mac. Я знаю, что в Linux маршрут -n даст результат, из которого я могу легко получить эту информацию. Однако это не работает в Mac OSX (Snow Leopard).

Я тоже пробовал netstat -nr | grep 'default', но надеялся на более чистый результат, подобный тому, который создается route -nв Linux / Unix. netstat -nrперечисляет все интерфейсы и шлюз по умолчанию для них.

Будем признательны за любые предложения или подсказки в правильном направлении.

SThomas
источник
3
Перейти на SuperUser?
JMD
3
К вашему сведению, вы можете Option + щелкнуть значок Wi-Fi в строке состояния. Это показывает дополнительную информацию, включая шлюз.
Петр Újezdský

Ответы:

189

Вы можете попробовать:

route -n get default

Это не то же самое, что GNU / Linux route -n(или даже ip route show), но полезно для проверки информации о маршруте по умолчанию. Кроме того, вы можете проверить маршрут, по которому пакеты будут идти к определенному хосту. Например

route -n get www.yahoo.com

Результат будет примерно таким:

   route to: 98.137.149.56
destination: default
       mask: 128.0.0.0
    gateway: 5.5.0.1
  interface: tun0
      flags: <UP,GATEWAY,DONE,STATIC,PRCLONING>
 recvpipe  sendpipe  ssthresh  rtt,msec    rttvar  hopcount      mtu     expire
       0         0         0         0         0         0      1500         0

ИМХО netstat -nrэто то, что нужно. Даже приложение-утилита MacOSX Network (*) использует вывод netstat для отображения информации о маршрутизации. Снимок экрана сетевой утилиты, отображающий информацию таблицы маршрутизации

Надеюсь, это поможет :)

(*) Вы можете запустить сетевую утилиту с open /Applications/Utilities/Network\ Utility.app

Хамбер
источник
Спасибо. Вы только что сэкономили мне несколько часов в новом доме, когда модем Time Warner решил, что ему нужен IP-адрес, который был у моего маршрутизатора, и ifconfig солгал о шлюзе.
Крис Доггетт
38

Чтобы получить список связанных IP-адресов, вы можете использовать команду netstat

netstat -rn 

Это дает длинный список IP-адресов, и нелегко найти нужное поле. Результат образца следующий:

Routing tables
Internet:
Destination        Gateway            Flags        Refs      Use   Netif Expire
default            192.168.195.1      UGSc           17        0     en2
127                127.0.0.1          UCS             0        0     lo0
127.0.0.1          127.0.0.1          UH              1   254107     lo0
169.254            link#7             UCS             0        0     en2
192.168.195        link#7             UCS             3        0     en2
192.168.195.1      0:27:22:67:35:ee   UHLWIi         22      397     en2   1193
192.168.195.5      127.0.0.1          UHS             0        0     lo0

More result is truncated.......

IP-адрес шлюза находится в первой строке; один со значением по умолчанию в первом столбце.

Чтобы отображать только выбранные строки результата, мы можем использовать команду grep вместе с netstat

netstat -rn | grep 'default'

Эта команда фильтрует и отображает те строки результатов, которые имеют значение по умолчанию. В этом случае вы можете увидеть следующий результат:

default            192.168.195.1      UGSc           14        0     en2

Если вы хотите найти только IP-адрес шлюза и ничего больше, вы можете дополнительно отфильтровать результат с помощью awk . Команда awk соответствует шаблону во входном результате и отображает результат. Это может быть полезно, когда вы используете свой результат непосредственно в какой-либо программе или пакетном задании.

netstat -rn | grep 'default' | awk '{print $2}'

Команда awk указывает сопоставить и распечатать второй столбец результата в тексте. Таким образом, окончательный результат выглядит так:

192.168.195.1

В этом случае netstat отображает весь результат, grep выбирает только строку со словом «default» в нем, а awk далее сопоставляет шаблон для отображения второго столбца в тексте.

Аналогичным образом вы можете использовать команду route -n get default, чтобы получить требуемый результат. Полная команда

route -n get default | grep 'gateway' | awk '{print $2}'

Эти команды хорошо работают в Linux, UNIX и MAC OS.

Прабху
источник
8

Утилита grep не нужна. AWK может все:

    netstat -rn | awk '/default/ {print $2}'
      192.168.128.1

Обратите внимание, что если у вас работает что-то вроде Parallels (или VPN, или того и другого), вы можете увидеть две или более записей маршрутизации по умолчанию - это будет верно, если вы также воспользуетесь предложением grep, приведенным выше.

    netstat -rn | awk '/default/ {print $2}'
      192.168.128.1
      link#12

и

    netstat -rn | awk '/default/ {print $2}'                             
      utun1
      192.168.128.1
      link#12

Чтобы установить переменную (_default) для дальнейшего использования (при условии, что только одна запись для 'default') .....

    _default=$( netstat -rn inet | awk '/default/ {print $2}' ) # I prefer $( ... ) over back-ticks

В случае нескольких маршрутов по умолчанию используйте:

    netstat -rn | awk '/default/ {if ( index($6, "en") > 0 ){print $2} }'
      192.168.128.1

Эти примеры протестированы в Mavericks Terminal.app и относятся только к OSX. Например, в других версиях * nix для сетевых / беспроводных подключений часто используется «eth», а не «en». Это также проверено только с ksh. Другим оболочкам может потребоваться немного другой синтаксис.

Concertogr
источник
3

Я бы использовал что-нибудь в этом роде ...

 netstat -rn | grep "default" | awk '{print $2}'
Роберт Нортард
источник
Как мы можем добиться этого в программировании на языке C? Есть ли для этого какие-нибудь рамки
MacDeveloper
0

Использование системных настроек:

Шаг 1. Щелкните значок Apple (в верхнем левом углу экрана) и выберите «Системные настройки».

Шаг 2: Щелкните Сеть.

Шаг 3: Выберите сетевое подключение и нажмите «Дополнительно».

Шаг 4: Выберите вкладку TCP / IP и найдите IP-адрес вашего шлюза в списке рядом с Router.

Джеймс Ник
источник