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

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

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

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

Ответ 1

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

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 для отображения информации о маршрутизации. Network utility screenshot displaying routing table information

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

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

Ответ 2

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

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

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

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

Ответ 3

Утилита 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=$( 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/беспроводных соединений, а не "en". Это также проверяется только с помощью ksh. Другим оболочкам может потребоваться несколько иной синтаксис.

Ответ 4

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

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