Uruchom skrypt w OS X 10.6 na połączeniu sieciowym. (jak /etc/network/if-up.d/)

17

Czy jest jakiś sposób na uruchomienie skryptu, gdy interfejs sieciowy pojawi się w Mac OS X?

Próbowałem umieścić skrypt o nazwie ip-up w / etc / ppp, ale wydaje się, że nie uruchamia się po odłączeniu i ponownym połączeniu z siecią bezprzewodową.

Wolałbym nie uruchamiać zadania cron, aby stale sprawdzać, czy zmienił się status sieci. W niektórych dystrybucjach Linuksa możesz to zrobić, umieszczając skrypt w /etc/network/if-up.d/. Czy jest coś podobnego w systemie Mac OS X?

Zxaos
źródło

Odpowiedzi:

5

Możesz wypróbować MarcoPolo lub jedno z podobnych narzędzi wymienionych na jego stronie internetowej. Zmieniacz lokalizacji wygląda obiecująco, jeśli jesteś minimalistą.

Daniel Beck
źródło
1
Wolę to zrobić bez instalowania dodatkowych programów. Jednak link Zmieniacz lokalizacji był bardzo pomocny, ponieważ zawiera uruchomioną konfigurację do uruchamiania programu przy zmianie sieci.
Zxaos,
1
Zxaos: Jasne, dlatego to zawarłem. Jest to w zasadzie szablon skryptu uruchomionego / bash do wszystkiego, czego chcesz. Oszczędza Ci to samodzielnego pisania kodu płyty kotłowej.
Daniel Beck
jeśli mogę ci przeszkadzać, aby spojrzeć na to bardzo istotne q ( superuser.com/questions/265861 ) byłbym bardzo wdzięczny (jak uruchomić i zatrzymać VPN z linii poleceń w OSX). Przepraszam za nakłanianie, niezależnie od tego usunę ten komentarz za kilka godzin. Dzięki w każdym razie!
Dan Rosenstark,
1
@ Yar Nie jest to problem, ale w Europie Środkowej jest już po północy, więc proszę zaczekać pół dnia przed pingowaniem mnie ponownie (i proszę, zrób to, jeśli nic nie pojawi się w międzyczasie, to interesujące pytanie).
Daniel Beck
Dzięki @Daniel Beck. Jak być może już widzieliście, odpowiedzią było użycie Applescript. Prawdopodobnie dotyczy wielu rzeczy w OSX, ale często o tym zapominam.
Dan Rosenstark,
19

Wygląda na to, że uruchomiony agent patrzy /etc/resolv.confi dwa powiązane z siecią pliki .plist poniżej /Library/Preferences/SystemConfiguration/działają dla mnie (w 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>

Wcześniej używałem tylko /etc/resolv.conf, ale były przypadki, w których to nie wystarczyło.

mivk
źródło
Było to dla mnie bardzo pomocne, ale wystąpił błąd (znaleziony przez [ta odpowiedź] [1]): <plist version="1.0">brakuje tagu otwierającego . [1] [ apple.stackexchange.com/a/181127/56862]
LiberalArtist
@patrix (i LiberalArtist): Dzięki za korektę. Nie zauważyłem, ponieważ zadziałało to w 10.8.5. Myślę, że późniejsze wersje są bardziej surowe.
mivk 18.04.15
@mivk Co dokładnie powinno się zmienić w tych SystemConfigurationplikach? Po podłączeniu / odłączeniu kabla sieciowego nic się nie zmienia
IceFire 24.09.18
Wydaje się, że jest blisko, ale jeśli wyłączę i ponownie włączę Wi-Fi, program działa tylko wtedy, gdy sieć się rozłącza, a nie po ponownym połączeniu. Widzę, że /etc/resolv.confplik jest usuwany i odczytywany, gdy zmienia się stan mojego Wi-Fi, więc nie jestem pewien, dlaczego działa tylko przy rozłączeniu.
Matt Huggins
5

Powinieneś rozważyć użycie crankd , który dokładnie pozwala na uruchamianie skryptów w odpowiedzi na wiele zdarzeń systemowych, takich jak zmiany w sieci, aktywność systemu plików, uruchamianie aplikacji itp.

Ponieważ nie mogłem znaleźć żadnej sensownej dokumentacji, napisałem również mały post na blogu na temat korzystania z crankd .

Juan A. Navarro
źródło
Twój blog jest chroniony przed anonimowym czytaniem. Proszę rozważyć powielenie treści tutaj.
nfirvine
Przepraszam za to. Mój blog został przeniesiony, więc właśnie zaktualizowałem adres URL. Edytuj odpowiedź, jeśli uważasz, że niektóre informacje z mojego postu można przenieść do tej odpowiedzi.
Juan A. Navarro
4

To wydaje się działać w bash:

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

zamień na echo changeswoje polecenie, pamiętając, że jeśli chcesz zacytować cokolwiek w swoim poleceniu, musisz użyć '\'':

(echo -e "n.add State:/Network/Global/IPv4\nn.watch" & cat) | \
 scutil | \
 awk '/notification/ {system("echo '\''&'\''")}'
Joe Hildebrand
źródło
3

ControlPlane: „Computing Sensitive Computing”

ControlPlane jest bezpośrednim portem MarcoPolo i tak naprawdę duża część konfiguracji z MarcoPolo nadal działa z ControlPlane, tylko lepiej! ControlPlane obsługuje 32-bitowe i 64-bitowe komputery Mac z procesorem Intel i systemem Snow Leopard lub nowszym.

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

cwd
źródło
2

Zacznij od uruchomienia. Korzystając z niej, możesz być w stanie uzyskać podobną funkcjonalność.

EDYCJA : 9 lat później, może nie. Zgodnie z tym wpisem w Wikipedii :

W 2014 roku, w systemie OS X 10.10 i iOS 8, Apple przeniósł kod do uruchomienia do zamkniętego źródła libxpc

CaseyIT
źródło
uruchomienie wydaje się być krokiem we właściwym kierunku, zwłaszcza jeśli mogę dowiedzieć się, w jaki sposób inne programy używają go do wykrywania zmian w sieci.
Zxaos,
@Zxaos, uruchomienie wydaje się krokiem we właściwym kierunku, ale nie ma niezawodnego sposobu, aby wykrył zmiany w sieci. Zobacz moją odpowiedź na rozwiązanie wykorzystujące zamiast tego crankd .
Juan A. Navarro
Adres URL prowadzi do strony 404.
Slaven Rezic
@ Slaven-Rezic Zaktualizowano odpowiedź i usunął stary link.
CaseyIT