Exécutez le script sous OS X 10.6 sur la connexion réseau. (comme /etc/network/if-up.d/)

17

Existe-t-il un moyen d'exécuter un script lorsqu'une interface réseau apparaît dans Mac OS X?

J'ai essayé de mettre un script nommé ip-up dans / etc / ppp mais il ne semble pas se déclencher lorsque je me déconnecte et me reconnecte à un réseau sans fil.

Je préfère ne pas avoir à exécuter une tâche cron pour vérifier en permanence si l'état du réseau a changé. Dans certaines distributions Linux, vous pouvez accomplir cela en plaçant un script dans /etc/network/if-up.d/. Existe-t-il quelque chose de similaire pour Mac OS X?

Zxaos
la source

Réponses:

5

Vous pouvez essayer MarcoPolo ou l'un des utilitaires similaires répertoriés sur son site Web. Emplacement Changer semble prometteur si vous êtes minimaliste.

Daniel Beck
la source
1
Je préfère le faire sans installer de programmes supplémentaires. Cependant, le lien Location Changer a été très utile car il inclut une configuration launchd pour exécuter le programme sur un changement de réseau.
Zxaos
1
Zxaos: Bien sûr, c'est pourquoi je l'ai inclus. Il s'agit essentiellement d'un modèle de script launchd / bash pour tout ce que vous voulez. Vous évite d'écrire le code passe-partout vous-même.
Daniel Beck
si je peux vous déranger pour regarder ce q très pertinent ( superuser.com/questions/265861 ) je l'apprécierais beaucoup (comment démarrer et arrêter vpn à partir de la ligne de commande sur OSX). Excusez la sollicitation, je vais quand même supprimer ce commentaire dans quelques heures. Merci en tout cas!
Dan Rosenstark
1
@Yar Pas de problème, mais il est minuit passé en Europe centrale en ce moment, alors attendez une demi-journée environ avant de me cingler à nouveau (et s'il vous plaît, faites-le si rien ne se produit entre-temps, c'est une question intéressante).
Daniel Beck
Merci @Daniel Beck. Comme vous l'avez peut-être déjà vu, utiliser Applescript était la réponse. C'est probablement pour beaucoup de choses sur OSX, mais je l'oublie souvent.
Dan Rosenstark
19

Un agent launchd regardant /etc/resolv.conf et deux fichiers .plist liés au réseau sous /Library/Preferences/SystemConfiguration/semblent fonctionner pour moi (sous 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>

J'avais auparavant utilisé uniquement /etc/resolv.conf, mais il y avait des cas où cela ne suffisait pas.

mivk
la source
Cela m'a été très utile, mais il y a une erreur (trouvée par [cette réponse] [1]): la <plist version="1.0">balise d' ouverture est manquante. [1] [ apple.stackexchange.com/a/181127/56862]
LiberalArtist
@patrix (et LiberalArtist): Merci pour la correction. Je ne l'avais pas remarqué, car cela fonctionnait pour moi en 10.8.5. Je suppose que les versions ultérieures sont plus strictes.
mivk
@mivk Qu'est-ce qui est censé changer exactement dans ces SystemConfigurationfichiers? Si je branche / débranche un câble réseau, rien ne semble changer
IceFire
Cela semble proche, mais si je désactive et rallume le wifi, le programme ne s'exécute que lorsque le réseau se déconnecte, pas lorsqu'il se reconnecte. Je vois que le /etc/resolv.conffichier est supprimé et lu à nouveau lorsque mon état wifi change, donc je ne sais pas pourquoi il ne fonctionne que lors de la déconnexion.
Matt Huggins
5

Vous devriez envisager d'utiliser crankd , qui vous permet précisément d'exécuter des scripts en réponse à de nombreux événements système tels que les changements de réseau, l'activité du système de fichiers, le lancement d'application, etc.

Comme je n'ai pu trouver aucune documentation raisonnable, j'ai également écrit un petit article de blog sur les premiers pas avec crankd .

Juan A. Navarro
la source
Votre blog est protégé contre la lecture anonyme. Veuillez envisager de dupliquer le contenu ici.
nfirvine
Désolé pour ça. Mon blog a déménagé, je viens donc de mettre à jour l'URL. N'hésitez pas à modifier la réponse si vous pensez que certaines des informations de mon message pourraient être migrées dans cette réponse.
Juan A. Navarro
4

Cela semble fonctionner en bash:

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

remplacer echo changepar votre commande, en gardant à l'esprit que si vous avez besoin de citer quelque chose dans votre commande, vous devrez utiliser '\'':

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

ControlPlane: «Calcul sensible au contexte»

ControlPlane est un port direct de MarcoPolo et en fait, une grande partie de la configuration de MarcoPolo fonctionne toujours avec ControlPlane, juste mieux! ControlPlane prend en charge les Mac à processeur Intel 32 et 64 bits exécutant Snow Leopard et versions supérieures.

entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici

cwd
la source
2

Commencez par launchd. Vous pourriez être en mesure d'utiliser des fonctionnalités similaires.

EDIT : 9 ans plus tard, peut-être pas. Selon cette entrée Wikipedia :

En 2014, avec OS X 10.10 et iOS 8, Apple a déplacé le code de launchd vers la source fermée libxpc

CaseyIT
la source
launchd semble être un pas dans la bonne direction, surtout si je peux comprendre comment d'autres programmes l'utilisent pour détecter les changements de réseau.
Zxaos
@Zxaos, launchd semble être un pas dans la bonne direction, mais il n'existe aucun moyen fiable de le faire détecter les changements de réseau. Voir ma réponse pour une solution utilisant crankd à la place.
Juan A. Navarro
L'URL mène à une page 404.
Slaven Rezic
@ Slaven-Rezic Mise à jour de la réponse et suppression de l'ancien lien.
CaseyIT