Вопрос или проблема
Есть ли способ запустить скрипт, когда сетевой интерфейс доступен в Mac OS X?
Я пробовал положить скрипт с именем ip-up в /etc/ppp, но он, похоже, не срабатывает, когда я отключаюсь и подключаюсь к беспроводной сети.
Я предпочел бы не запускать cron для постоянной проверки изменения статуса сети. В некоторых дистрибутивах Linux это можно сделать, положив скрипт в /etc/network/if-up.d/. Есть ли что-то подобное для Mac OS X?
Вы можете попробовать MarcoPolo или одну из подобных утилит, перечисленных на его сайте. Location Changer выглядит многообещающе, если вы минималист.
Я использовал 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
, но были случаи, когда этого было недостаточно.
Вам стоит рассмотреть возможность использования crankd, который позволяет запускать скрипты в ответ на многие системные события, такие как изменения сети, деятельность файловой системы, запуск приложений и т.д.
Поскольку я не смог найти разумной документации, я также написал небольшую заметку в блоге о начале работы с crankd.
Это, кажется, работает в 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 '\''&'\''")}'
ControlPlane: “Контекстно-зависимые вычисления”
ControlPlane является прямым портом MarcoPolo, и на самом деле, большая часть конфигурации из MarcoPolo по-прежнему работает с ControlPlane, только лучше! ControlPlane поддерживает 32 и 64-битные Mac на базе Intel, работающие на Snow Leopard и выше.
Начните с launchd. Возможно, вы сможете добиться подобной функциональности с его помощью.
ИЗМЕНЕНИЕ: 9 лет спустя, возможно, уже нет. Согласно этой записи в Википедии:
В 2014 году с OS X 10.10 и iOS 8 Apple перенес код для launchd в закрытую библиотеку libxpc
Чтобы выполнить функцию всякий раз, когда вы подключаетесь к Wi-Fi сети с использованием Hammerspoon, вы можете использовать модуль hs.wifi.watcher
. Этот модуль позволяет отслеживать изменения в SSID Wi-Fi (имя сети) и выполнять обратный вызов всякий раз, когда обнаружено изменение.
--- * Wi-Fi Наблюдатель
wifiWatcher = nil
previousSSID = hs.wifi.currentNetwork()
-- Определите функцию обратного вызова
function ssidChangedCallback()
local newSSID = hs.wifi.currentNetwork()
if newSSID ~= previousSSID then
previousSSID = newSSID
if not newSSID then
hs.alert("Отключено от Wi-Fi сети: " .. (previousSSID or "Нет"), 1)
else
hs.alert("Подключено к Wi-Fi сети: " .. (newSSID or "Нет"), 1)
end
end
end
-- Создайте и запустите наблюдатель Wi-Fi
wifiWatcher = hs.wifi.watcher.new(ssidChangedCallback)
wifiWatcher:start()
---
Ссылки:
Ответ или решение
В macOS 10.6 (и более поздних версиях) нет прямого аналога механизма if-up.d
, как в некоторых дистрибутивах Linux, где вы можете просто разместить скрипт для выполнения при поднятии сетевого интерфейса. Однако существуют различные способы, с помощью которых вы можете добиться желаемого поведения. Ниже приведены несколько подходов:
1. Использование Launchd
launchd
позволяет запускать скрипты в ответ на изменения состояния системы, включая сетевые соединения. Вы можете создать plist-файл, который будет отслеживать изменения в конфигурациях сети, такие как /etc/resolv.conf
и файлы конфигурации сети в /Library/Preferences/SystemConfiguration/
. Пример файла plist:
<?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-script</string>
<key>ProgramArguments</key>
<array>
<string>/путь/к/вашему/скрипту.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>
Сохраните этот файл с расширением .plist
в /Library/LaunchAgents/
или /Library/LaunchDaemons/
, в зависимости от того, хотите ли вы, чтобы он запускался для конкретного пользователя или для всех пользователей.
2. Использование Crankd
Crankd – это программа, которая позволяет запускать скрипты в ответ на различные системные события, включая изменения сети. Она подходит для выполнения вашей задачи без использования cron-задач. Документация может отсутствовать, но примеры использования можно найти в блогах и форумах.
3. Использование Hammerspoon
Если вы предпочитаете более визуальный подход и хотите работать с Lua, можно использовать Hammerspoon, которая предоставляет доступ к различным API macOS. Например, с помощью модуля hs.wifi.watcher
вы можете отслеживать изменения в SSID Wi-Fi и выполнять функции, когда происходит изменение.
Пример кода на Lua для Hammerspoon:
wifiWatcher = nil
previousSSID = hs.wifi.currentNetwork()
function ssidChangedCallback()
local newSSID = hs.wifi.currentNetwork()
if newSSID ~= previousSSID then
previousSSID = newSSID
hs.alert("Подключение к Wi-Fi: " .. (newSSID or "Не подключено"), 1)
end
end
wifiWatcher = hs.wifi.watcher.new(ssidChangedCallback)
wifiWatcher:start()
4. Использование сторонних утилит
Также существуют утилиты, такие как ControlPlane и MarcoPolo, которые могут помочь в автоматизации задач на основе изменения местоположения или сетевых условий. Эти утилиты позволяют запускать определенные действия при взаимосвязи с изменением сетевого статуса.
Заключение
Хотя в macOS нет прямого эквивалента механизма if-up.d
, существует множество методов и инструментов, которые можно использовать для выполнения скриптов по событию подключения или изменения сети. Выбор метода зависит от ваших предпочтений и специфики задачи.