Как получить шлюз по умолчанию в Mac OSX - PullRequest
115 голосов
/ 22 июля 2011

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

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

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

Ответы [ 4 ]

180 голосов
/ 02 октября 2011

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

route -n get default

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

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 (*) использует вывод netstat для отображения информации о маршрутизации. Network utility screenshot displaying routing table information

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

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

36 голосов
/ 14 июля 2013

Для получения списка связанных 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 по умолчанию, чтобы получить требуемый результат.Полная команда:

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

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

8 голосов
/ 09 декабря 2013

Утилита 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» для соединений ethernet / wireless, а не «en».Это также проверяется только с ksh.Для других оболочек может потребоваться немного другой синтаксис.

3 голосов
/ 17 июня 2013

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

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