Execute o script no OS X 10.6 na conexão de rede. (como /etc/network/if-up.d/)

17

Existe alguma maneira de executar um script quando uma interface de rede é exibida no Mac OS X?

Tentei colocar um script chamado ip-up em / etc / ppp, mas ele não parece disparar quando eu desconecto e reconecto a uma rede sem fio.

Prefiro não ter que executar um trabalho cron para verificar constantemente se o status da rede mudou. Em algumas distribuições Linux, você pode fazer isso colocando um script em /etc/network/if-up.d/. Existe algo semelhante para o Mac OS X?

Zxaos
fonte

Respostas:

5

Você pode experimentar o MarcoPolo ou um dos utilitários semelhantes listados em seu site. O Location Changer parece promissor se você é minimalista.

Daniel Beck
fonte
11
Eu preferiria fazer isso sem instalar programas adicionais. No entanto, o link Location Changer foi muito útil, pois inclui uma configuração de inicialização para executar o programa em uma alteração de rede.
`` Zxaos
11
Zxaos: Claro, foi por isso que incluí. É basicamente um modelo de script launchd / bash para o que você quiser. Evita que você escreva o código padrão.
Daniel Beck
se eu puder incomodá-lo a olhar para este q muito relevante ( superuser.com/questions/265861 ) eu agradeceria muito (como iniciar e parar o vpn na linha de comando no OSX). Desculpe a solicitação, excluirei este comentário em algumas horas, independentemente. Obrigado em qualquer caso!
Dan Rosenstark
11
@Yar Não é um problema, mas já passou da meia-noite na Europa central, por isso aguarde meio dia ou mais antes de me ligar novamente (e faça isso, se nada acontecer nesse meio tempo, é uma pergunta interessante).
Daniel Beck
Obrigado @Daniel Beck. Como você talvez já tenha visto, usar o Applescript foi a resposta. Provavelmente é para muitas coisas no OSX, mas muitas vezes esqueço.
Dan Rosenstark
19

Um agente launchd assistindo /etc/resolv.confe dois arquivos .plist relacionados à rede abaixo /Library/Preferences/SystemConfiguration/parecem funcionar para mim (no 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>

Eu já havia usado apenas o /etc/resolv.conf, mas houve casos em que isso não foi suficiente.

mivk
fonte
Isso foi muito útil para mim, mas há um erro (encontrado por [esta resposta] [1]): a <plist version="1.0">tag de abertura está ausente. [1] [ apple.stackexchange.com/a/181127/56862]
LiberalArtist
@patrix (e LiberalArtist): Obrigado pela correção. Eu não tinha notado, porque funcionou para mim em 10.8.5. Eu acho que as versões posteriores são mais rigorosas.
mivk
@mivk O que exatamente deve mudar nesses SystemConfigurationarquivos? Se eu ligar / desconectar um cabo de rede, nada parece mudar nada
IceFire
Isso parece próximo, mas se eu desligar e ligar novamente o Wi-Fi, o programa só será executado quando a rede for desconectada, não quando for reconectada. Vejo que o /etc/resolv.confarquivo é excluído e lido quando o meu estado wifi muda, por isso não sei por que ele está sendo executado apenas na desconexão.
Matt Huggins
5

Você deve considerar o uso do crankd , que permite executar scripts com precisão em resposta a muitos eventos do sistema, como alterações de rede, atividade do sistema de arquivos, inicialização de aplicativos etc.

Como não consegui encontrar nenhuma documentação sensata, também escrevi um pequeno post sobre como começar a usar o crankd .

Juan A. Navarro
fonte
Seu blog está protegido contra leitura anônima. Considere duplicar o conteúdo aqui.
Nflvine
Me desculpe por isso. Meu blog mudou, então acabei de atualizar o URL. Sinta-se à vontade para editar a resposta se achar que algumas das informações da minha postagem podem ser migradas para essa resposta.
Juan A. Navarro
4

Isso parece funcionar no bash:

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

substitua echo changepor seu comando, lembrando que, se precisar citar algo em seu comando, será necessário usar '\'':

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

ControlPlane: “Computação sensível ao contexto”

O ControlPlane é uma porta direta do MarcoPolo e, de fato, grande parte da configuração do MarcoPolo ainda funciona com o ControlPlane, apenas melhor! O ControlPlane suporta Macs Intel de 32 e 64 bits com o Snow Leopard e superior.

insira a descrição da imagem aqui insira a descrição da imagem aqui insira a descrição da imagem aqui

cwd
fonte
2

Comece com o launchd. Você pode ter uma funcionalidade semelhante usando-o.

EDIT : 9 anos depois, talvez não. De acordo com esta entrada da Wikipedia :

Em 2014, com o OS X 10.10 e o iOS 8, a Apple mudou o código do launchd para o libxpc de código fechado

CaseyIT
fonte
O launchd parece ser um passo na direção certa, especialmente se eu puder descobrir como outros programas o usam para detectar alterações na rede.
Zxaos
@Zxaos, launchd parece ser um passo na direção certa, mas não há uma maneira confiável de detectar alterações na rede. Veja minha resposta para uma solução usando crankd .
Juan A. Navarro
O URL leva a uma página 404.
Slaven Rezic 26/09/19
@ Slaven-Rezic Resposta atualizada e removido o link antigo.
CaseyIT 27/09/19