Запустите скрипт в OS X 10.6 по сетевому соединению. (например, /etc/network/if-up.d/)

17

Есть ли способ запустить скрипт, когда в Mac OS X появляется сетевой интерфейс?

Я попытался поместить скрипт с именем ip-up в / etc / ppp, но он не срабатывает, когда я отключаюсь и снова подключаюсь к беспроводной сети.

Я бы предпочел не запускать задание cron, чтобы постоянно проверять, изменилось ли состояние сети. В некоторых дистрибутивах Linux вы можете сделать это, поместив скрипт в /etc/network/if-up.d/. Есть ли что-нибудь подобное для Mac OS X?

Zxaos
источник

Ответы:

5

Вы можете попробовать MarcoPolo или одну из подобных утилит, перечисленных на его сайте. Расположение Changer выглядит многообещающе, если вы минималист.

Даниэль Бек
источник
1
Я бы предпочел сделать это без установки дополнительных программ. Однако ссылка Location Changer была очень полезна, так как она включает в себя конфигурацию launchd для запуска программы при изменении сети.
Zxaos
1
Zxaos: Конечно, именно поэтому я включил его. Это в основном шаблон сценария launchd / bash для всего, что вы хотите. Спасает вас от написания стандартного кода самостоятельно.
Даниэль Бек
если я могу побеспокоить вас взглянуть на этот очень важный вопрос ( superuser.com/questions/265861 ), я был бы очень признателен (как запустить и остановить vpn из командной строки в OSX). Извините, я буду удалять этот комментарий через несколько часов. Спасибо в любом случае!
Дэн Розенстарк
1
@ Яр Не проблема, но сейчас в центральной Европе уже полночь, поэтому, пожалуйста, подождите полдня или около того, прежде чем снова пинговать меня (и, пожалуйста, сделайте это, если ничего не произойдет, это интересный вопрос).
Даниэль Бек
Спасибо @ Даниэль Бек. Как вы, возможно, уже видели, использование Applescript было ответом. Это, вероятно, для многих вещей на OSX, но я часто забываю это.
Дэн Розенстарк
19

Наблюдение за агентом launchd /etc/resolv.confи два файла .plist, связанных с сетью, /Library/Preferences/SystemConfiguration/похоже, мне подходят (в Mac OS X 10.8.4):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" \
 "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>ifup.ddns</string>

  <key>LowPriorityIO</key>
  <true/>

  <key>ProgramArguments</key>
  <array>
    <string>/Users/Shared/bin/ddns-update.sh</string>
  </array>

  <key>WatchPaths</key>
  <array>
    <string>/etc/resolv.conf</string>
    <string>/Library/Preferences/SystemConfiguration/NetworkInterfaces.plist</string>
    <string>/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist</string>
  </array>

  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

Ранее я использовал только /etc/resolv.conf, но были случаи, когда этого было недостаточно.

mivk
источник
Это было очень полезно для меня, но есть ошибка (найдена [этим ответом] [1]): открывающий <plist version="1.0">тег отсутствует. [1] [ apple.stackexchange.com/a/181127/56862]
LiberalArtist,
@patrix (и LiberalArtist): Спасибо за исправление. Я не заметил, потому что это работало на меня в 10.8.5. Я думаю, что более поздние версии более строгие.
mivk
@mivk Что именно должно измениться в этих SystemConfigurationфайлах? Если я
подключу / отключу
Это кажется близким, но если я выключаю и снова включаю Wi-Fi, программа запускается только при отключении сети, а не при повторном подключении. Я вижу, что /etc/resolv.confфайл удаляется и читается при изменении состояния Wi-Fi, поэтому я не уверен, почему он работает только при отключении.
Мэтт Хаггинс
5

Вы должны рассмотреть возможность использования crankd , который точно позволяет запускать сценарии в ответ на многие системные события, такие как изменения в сети, активность файловой системы, запуск приложений и т. Д.

Поскольку я не смог найти никакой разумной документации, я также написал небольшую запись в блоге о том, как начать использовать crankd .

Хуан А. Наварро
источник
Ваш блог защищен от анонимного чтения. Пожалуйста, рассмотрите возможность дублирования контента здесь.
nfirvine
Прости за это. Мой блог переехал, поэтому я только что обновил URL. Не стесняйтесь редактировать ответ, если считаете, что часть информации из моего поста может быть перенесена в этот ответ.
Хуан А. Наварро
4

Это похоже на работу в Bash:

(echo -e "n.add State:/Network/Global/IPv4\nn.watch" & cat) | \
 scutil | \
 awk '/notification/ {system("echo change")}'

замените его echo changeсвоей командой, помня, что если вам нужно что-то заключить в команду, вам нужно использовать '\'':

(echo -e "n.add State:/Network/Global/IPv4\nn.watch" & cat) | \
 scutil | \
 awk '/notification/ {system("echo '\''&'\''")}'
Джо Хильдебранд
источник
3

ControlPlane: «контекстно-зависимые вычисления»

ControlPlane - это прямой порт MarcoPolo, и фактически большая часть конфигурации от MarcoPolo все еще работает с ControlPlane, просто лучше! ControlPlane поддерживает 32- и 64-битные компьютеры Mac на базе Intel, работающие под управлением Snow Leopard и выше.

введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь

УХО
источник
2

Начните с launchd. Вы могли бы быть в состоянии подобной функциональности, используя это.

РЕДАКТИРОВАТЬ : 9 лет спустя, может быть, нет. Согласно этой записи в Википедии :

В 2014 году с OS X 10.10 и iOS 8 Apple переместила код для запуска в закрытый исходный код libxpc

CaseyIT
источник
Похоже, launchd - это шаг в правильном направлении, особенно если я смогу выяснить, как другие программы используют его для обнаружения изменений в сети.
Zxaos
@Zxaos, launchd кажется шагом в правильном направлении, но нет надежного способа заставить его обнаруживать изменения в сети. Смотрите мой ответ для решения, используя взамен crankd .
Хуан А. Наварро
URL ведет на страницу 404.
Slaven Rezic
@ Slaven-Rezic Обновлен ответ и удалена старая ссылка.
CaseyIT