Ejecute el script en OS X 10.6 en la conexión de red. (como /etc/network/if-up.d/)

17

¿Hay alguna forma de ejecutar un script cuando aparece una interfaz de red en Mac OS X?

Intenté poner un script llamado ip-up en / etc / ppp pero parece que no se activa cuando me desconecto y vuelvo a conectar a una red inalámbrica.

Prefiero no tener que ejecutar un trabajo cron para verificar constantemente si el estado de la red ha cambiado. En algunas distribuciones de Linux, puede lograr esto colocando un script en /etc/network/if-up.d/. ¿Hay algo similar para Mac OS X?

Zxaos
fuente

Respuestas:

5

Puede probar MarcoPolo o una de las utilidades similares que figuran en su sitio web. Location Changer parece prometedor si eres minimalista.

Daniel Beck
fuente
1
Prefiero hacer esto sin instalar programas adicionales. Sin embargo, el enlace del Cambiador de ubicación fue muy útil ya que incluye una configuración de launchd para ejecutar el programa en un cambio de red.
Zxaos
1
Zxaos: Claro, por eso lo incluí. Básicamente es una plantilla de script launchd / bash para lo que quieras. Le evita escribir el código repetitivo usted mismo.
Daniel Beck
si puedo molestarte para que mires esta q muy relevante ( superuser.com/questions/265861 ) te lo agradecería mucho (cómo iniciar y detener vpn desde la línea de comandos en OSX). Disculpe la solicitud, eliminaré este comentario en unas horas independientemente. Gracias en cualquier caso!
Dan Rosenstark
1
@Yar No es un problema, pero es más de la medianoche en Europa central en este momento, así que espere medio día más o menos antes de volver a hacerme un ping (y mientras tanto no surja nada, es una pregunta interesante).
Daniel Beck
Gracias @Daniel Beck. Como tal vez ya viste, usar Applescript fue la respuesta. Probablemente sea para muchas cosas en OSX, pero a menudo lo olvido.
Dan Rosenstark
19

Un agente de launchd que mira /etc/resolv.conf, y dos archivos .plist relacionados con la red bajo /Library/Preferences/SystemConfiguration/parece 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 hubo casos en que eso no fue suficiente.

mivk
fuente
Esto fue muy útil para mí, pero hay un error (encontrado por [esta respuesta] [1]): <plist version="1.0">falta la etiqueta de apertura . [1] [ apple.stackexchange.com/a/181127/56862]
LiberalArtist
@patrix (y LiberalArtist): Gracias por la corrección. No me había dado cuenta, porque funcionó para mí en 10.8.5. Supongo que las versiones posteriores son más estrictas.
mivk
@mivk ¿Qué se supone que cambia exactamente en estos SystemConfigurationarchivos? Si enchufo / desconecto un cable de red, nada parece cambiar en absoluto
IceFire
Esto parece cercano, pero si apago y vuelvo a encender el wifi, entonces el programa solo se ejecuta cuando la red se desconecta, no cuando se vuelve a conectar. Veo que el /etc/resolv.confarchivo se elimina y se lee cuando cambia mi estado wifi, por lo que no estoy seguro de por qué solo se ejecuta al desconectar.
Matt Huggins, el
5

Debería considerar usar crankd , que precisamente le permite ejecutar scripts en respuesta a muchos eventos del sistema, como cambios en la red, actividad del sistema de archivos, inicio de aplicaciones, etc.

Como no pude encontrar ninguna documentación sensata, también escribí una pequeña publicación de blog sobre cómo comenzar a usar crankd .

Juan A. Navarro
fuente
Su blog está protegido contra la lectura anónima. Por favor considere duplicar el contenido aquí.
nfirvine
Lo siento por eso. Mi blog se ha movido, así que acabo de actualizar la url. Siéntase libre de editar la respuesta si cree que parte de la información de mi publicación podría migrarse a esta respuesta.
Juan A. Navarro
4

Esto parece funcionar en bash:

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

reemplace echo changecon su comando, teniendo en cuenta que si necesita citar algo en su comando, deberá usar '\'':

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

ControlPlane: "Context Sensitive Computing"

ControlPlane es un puerto directo de MarcoPolo y, de hecho, gran parte de la configuración de MarcoPolo todavía funciona con ControlPlane, ¡simplemente mejor! ControlPlane admite Mac basados ​​en Intel de 32 y 64 bits que ejecutan Snow Leopard y superior.

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

cwd
fuente
2

Comience con launchd. Es posible que pueda utilizar una funcionalidad similar.

EDITAR : 9 años después, tal vez no. De acuerdo con esta entrada de Wikipedia :

En 2014, con OS X 10.10 e iOS 8, Apple movió el código para lanzarlo a libxpc de código cerrado

CaseyIT
fuente
launchd parece que es un paso en la dirección correcta, especialmente si puedo descubrir cómo otros programas lo usan para detectar cambios en la red.
Zxaos
@Zxaos, launchd parece un paso en la dirección correcta, pero no hay una manera confiable de hacer que detecte cambios en la red. Vea mi respuesta para una solución usando crankd en su lugar.
Juan A. Navarro
La URL lleva a una página 404.
Slaven Rezic
@ Slaven-Rezic Respuesta actualizada y eliminado enlace viejo.
CaseyIT