Esegui script in OS X 10.6 sulla connessione di rete. (come /etc/network/if-up.d/)


17

Esiste un modo per eseguire uno script quando viene visualizzata un'interfaccia di rete in Mac OS X?

Ho provato a mettere uno script chiamato ip-up in / etc / ppp ma non sembra attivarsi quando mi disconnetto e riconnetto a una rete wireless.

Preferirei non dover eseguire un processo cron per verificare costantemente se lo stato della rete è cambiato. In alcune distribuzioni di Linux, puoi farlo inserendo uno script in /etc/network/if-up.d/. C'è qualcosa di simile per Mac OS X?

Risposte:


5

Puoi provare MarcoPolo o una delle utility simili elencate sul suo sito Web. Location Changer sembra promettente se sei un minimalista.


1
Preferirei farlo senza installare programmi aggiuntivi. Tuttavia, il collegamento Cambio posizione è stato molto utile poiché include una configurazione launchd per l'esecuzione del programma su una modifica di rete.
Zxaos,

1
Zxaos: Certo, ecco perché l'ho incluso. È fondamentalmente un modello di script launchd / bash per quello che vuoi. Ti evita di scrivere tu stesso il codice del boilerplate.
Daniel Beck

se posso darti fastidio a guardare questo q molto rilevante ( superuser.com/questions/265861 ) lo apprezzerei molto (come avviare e fermare vpn dalla riga di comando su OSX). Scusa il sollecito, eliminerò questo commento tra qualche ora a prescindere. Grazie in ogni caso!
Dan Rosenstark,

1
@Yar Non è un problema, ma è passata la mezzanotte nell'Europa centrale in questo momento, quindi per favore aspetta mezza giornata circa prima di chiamarmi di nuovo (e per favore fallo se nel frattempo non succede nulla, è una domanda interessante).
Daniel Beck

Grazie @ Daniel Beck. Come forse hai già visto, usare Applescript è stata la risposta. Probabilmente è su molte cose su OSX, ma spesso lo dimentico.
Dan Rosenstark,

19

Un agente di avvio che guarda /etc/resolv.confe due file .plist relativi alla rete sotto /Library/Preferences/SystemConfiguration/sembra funzionare per me (in 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>

In precedenza avevo usato solo /etc/resolv.conf, ma c'erano casi in cui ciò non era abbastanza.


Questo mi è stato molto utile, ma c'è un errore (trovato da [questa risposta] [1]): <plist version="1.0">manca il tag di apertura . [1] [ apple.stackexchange.com/a/181127/56862]
LiberalArtist

@patrix (e LiberalArtist): grazie per la correzione. Non me ne ero accorto, perché ha funzionato per me in 10.8.5. Immagino che le versioni successive siano più severe.
lunedì

@mivk Cosa dovrebbe cambiare esattamente in questi SystemConfigurationfile? Se collego / scollego un cavo di rete, nulla sembra cambiare affatto
IceFire

Questo sembra vicino, ma se spengo e riaccendo il wifi, il programma funziona solo quando la rete si disconnette, non quando si riconnette. Vedo che il /etc/resolv.conffile viene eliminato e preparato quando il mio stato wifi cambia, quindi non sono sicuro del motivo per cui è in esecuzione solo su disconnessione.
Matt Huggins,

5

Dovresti prendere in considerazione l'uso di crankd , che ti consente di eseguire script in risposta a molti eventi di sistema come cambiamenti di rete, attività del file system, avvio dell'applicazione, ecc.

Poiché non sono riuscito a trovare alcuna documentazione ragionevole, ho anche scritto un piccolo post sul blog su come iniziare a utilizzare crankd .


Il tuo blog è protetto dalla lettura anonima. Ti preghiamo di considerare di duplicare il contenuto qui.
nfirvine,

Mi dispiace per quello. Il mio blog si è spostato, quindi ho appena aggiornato l'URL. Sentiti libero di modificare la risposta se ritieni che alcune delle informazioni del mio post possano essere migrate in questa risposta.
Juan A. Navarro,

4

Questo sembra funzionare in bash:

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

sostituiscilo echo changecon il tuo comando, tenendo presente che se devi citare qualcosa nel tuo comando, dovrai usare '\'':

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

3

ControlPlane: "Informatica sensibile al contesto"

ControlPlane è un porto diretto di MarcoPolo e in effetti, gran parte della configurazione di MarcoPolo funziona ancora con ControlPlane, semplicemente meglio! ControlPlane supporta Mac basati su Intel a 32 e 64 bit con Snow Leopard e versioni successive.

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine


2

Inizia con launchd. Potresti essere in grado di funzionalità simili utilizzandolo.

EDIT : 9 anni dopo, forse no. Secondo questa voce di Wikipedia :

Nel 2014, con OS X 10.10 e iOS 8, Apple ha spostato il codice per il lancio su libxpc a sorgente chiuso


launchd sembra essere un passo nella giusta direzione, soprattutto se riesco a capire come altri programmi lo usano per rilevare i cambiamenti di rete.
Zxaos,

@Zxaos, launchd sembra un passo nella giusta direzione, ma non esiste un modo affidabile per rilevare le modifiche alla rete. Vedi invece la mia risposta per una soluzione usando crankd .
Juan A. Navarro,

L'URL conduce a una pagina 404.
Slaven

@ Slaven-Rezic Risposta aggiornata e rimosso vecchio link.
CaseyIT,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.