¿Cómo se ejecuta un script después de que aparece una interfaz de red?

7

¿Hay una manera de ejecutar un script cada vez que una interfaz de red termina de aparecer? O, ¿hay una respuesta equivalente a esta pregunta de Debian en OSX?

    
pregunta Matt 28.11.2011 - 02:09

4 respuestas

1

No he probado esta solución por mi cuenta, pero encontré este hilo: enlace

  

Debería considerar el uso de crankd , que le permite ejecutar scripts en respuesta a muchos eventos del sistema, como cambios de red, sistemas de archivos. actividad, lanzamiento de aplicaciones, etc.

     

Como no pude encontrar ninguna documentación razonable, también escribí una pequeña publicación en el blog comenzar a usar crankd .

    
respondido por el Rene Larsen 01.12.2011 - 15:49
8

Lo siguiente funciona en Mac OS X 10.11.3 (El Capitán)

crea un archivo: 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>

Y registrarlo con:

launchctl load networkchange.plist
launchctl start networkchange

tenga en cuenta que la secuencia de comandos es ejecutada por el usuario que registra el plist.

    
respondido por el laurent 23.03.2016 - 18:39
6

Un agente de launchd que mira /etc/resolv.conf , y dos archivos .plist relacionados con la red bajo /Library/Preferences/SystemConfiguration/ parecen funcionar para mí (en 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>

Anteriormente solo había usado /etc/resolv.conf, pero había casos en los que eso no era suficiente.

    
respondido por el mivk 02.08.2013 - 00:18
1

He terminado con este 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

Comprueba una red 10 veces y la red tiene 2 * 10 segundos para levantarse.

    
respondido por el hsrv 03.08.2017 - 12:23

Lea otras preguntas en las etiquetas