10 votes

Comment exécuter un script après le démarrage d'une interface réseau ?

Existe-t-il un moyen d'exécuter un script chaque fois qu'une interface réseau finit de se présenter ? Ou, existe-t-il une réponse équivalente à cette question sur Debian sur OSX ?

15voto

laurent Points 181

Ce qui suit fonctionne sur Mac OS X 10.11.3 (El Capitan)

  1. Créez un fichier : networkchange.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>networkchange</string> <key>LowPriorityIO</key> <true/> <key>ProgramArguments</key> <array> <string>/Users/Shared/bin/networkchange.sh</string> </array> <key>WatchPaths</key> <array> <string>/etc/resolv.conf</string> <string>/var/run/resolv.conf</string> <string>/private/var/run/resolv.conf</string> </array> <key>RunAtLoad</key> <true/> </dict> </plist>

  2. Ensuite, enregistrez-vous en exécutant les commandes suivantes dans le Terminal :

    launchctl load networkchange.plist launchctl start networkchange

Notez que le script est exécuté par l'utilisateur qui enregistre la plist.

9voto

mivk Points 807

Un agent launchd qui surveille /etc/resolv.conf et deux fichiers .plist liés au réseau sous le nom de /Library/Preferences/SystemConfiguration/ semble 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>

Auparavant, je n'utilisais que /etc/resolv.conf, mais dans certains cas, cela ne suffisait pas.

2voto

hsrv Points 121

Je me suis retrouvé avec ce script :

#!/bin/bash

COUNTER=0
while [ $COUNTER -lt 10 ]; do
    let COUNTER=COUNTER+1

    # assign to test at each iteration otherwise the output won't be changed
    test=$(ifconfig -a inet 2>/dev/null | sed -n -e '/127.0.0.1/d' -e '/0.0.0.0/d' -e '/inet/p' | wc -l)

    if [ "${test}" -gt 0 ]; then
        # do the job here

        # exit the loop
        let COUNTER=COUNTER+10
        break
    fi

    # give a little time for a network to get up
    sleep 2
done

Il vérifie un réseau 10 fois et le réseau a 2*10 secondes pour se lever.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X