Comment exécuter automatiquement un script après la connexion à un VPN sur OS X?

J'ai configuré la connexion VPN dans OS X 10.7.3, mais puisque le réseau auquel je me connecte utilise un proxy d'entreprise, possède des serveurs de référentiel Maven personnalisés et d'autres paramètres spécifiques au réseau (les lecteurs distants, par exemple), je veux Exécutez un script sur la connexion / fermeture de session d'un VPN à:

  • Changez le Maven ~/.m2/settings.xml pour pointer vers leur compte maven
  • smb:// quelques smb:// actions,
  • Alias ​​certaines commandes pour utiliser leurs serveurs

Je ne sais pas comment réussir.

  1. Comment exécuter un script ou un ensemble de commandes automatiquement lors de la connexion ?
  2. Comment exécuter automatiquement un script ou un ensemble de commandes lors de la fermeture de session ?

Si vous avez déjà configuré le VPN, vous pouvez vous connecter via la ligne de commande. Comme je l'ai expliqué dans cette réponse , vous pouvez créer deux fonctions shell pour la connexion et le déconnexion, respectivement, en les ajoutant à votre ~/.bash_profile – voir la réponse liée pour la fonction vpn-disconnect .

 function vpn-connect { /usr/bin/env osascript <<-EOF tell application "System Events" tell current location of network preferences set VPN to service "UniVPN" -- your VPN name here if exists VPN then connect VPN end tell end tell EOF # insert your commands here } 

Ajoutez simplement les commandes personnalisées dont vous avez besoin après le marqueur EOF .


Si vous voulez un mode GUI pour le faire, ouvrez Automator.app et créez une nouvelle application . Ensuite, faites glisser les actions pour exécuter un script AppleScript et Shell dans le volet de gauche, puis insérez les commandes comme indiqué ci-dessous.

Vous pouvez alors mettre cette pseudo-application dans votre Dock pour la lancer rapidement.

Une autre solution est d'utiliser un LaunchDaemon pour surveiller un répertoire spécifique et lancer un script externe chaque fois que ce répertoire a des modifications. La Mac Developer Library donne un aperçu d'un tel script (leur exemple surveille /etc/hostconfig et exécute syslog -s -l notice "somebody touched /etc/hostconfig" chaque fois que le temps de modification de ce fichier change.)

Pour notre raison d'être, nous notons que chaque fois que vous vous connectez à votre VPN, le répertoire /Library/Preferences/SystemConfiguration est modifié. Donc, si vous enregistrez le fichier plist suivant dans /Library/LaunchDaemons/vpn.connectscript.plist , il surveillera ce répertoire:

 <?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>vpn.connectscript</string> <key>ProgramArguments</key> <array> <string>/bin/bash</string> <string>/opt/local/bin/vpn_some_script.sh</string> </array> <key>WatchPaths</key> <array> <string>/Library/Preferences/SystemConfiguration</string> </array> </dict> </plist> 

Notez que ce LaunchDaemon sera appelé pour plus que votre connexion VPN (p. Ex., Chaque fois que vous vous connectez au wifi). Ainsi, votre script /opt/local/bin/vpn_some_script.sh devrait vérifier si le tunnel est effectivement connecté et que le script ne doit pas générer de problèmes s'il est exécuté plusieurs fois par ligne. (Donc, si vous montez des parts, vous voudrez peut-être vérifier qu'ils ne sont pas déjà montés).

Par exemple, mon script /opt/local/bin/vpn_some_script.sh est simplement:

 #!/bin/bash # This only changes the routes table if utun0 exists. # -n checks that `ifconfig utun0` returns something other than "" on STDOUT # The 2> /dev/null redirects STDERR to null, to silence errors if [[ -n `ifconfig utun0 2> /dev/null` ]] ; then route -n add -net 10.0.0.0/8 -interface utun0 # Find the old default gateway GATEWAY=`route -n get default -ifscope en0 | grep gateway | awk '{ print $2 }'` # make everything (except blocks described above) go through old default gateway rather than VPN route -n change default $GATEWAY fi 

Qui n'ajoute que l'itinéraire au 10.0.0.0/8 à travers le tunnel si je suis connecté au tunnel VPN (et change le réglage par défaut pour aller au routeur 192.168.1.1).

Lorsque vous enregistrez le fichier plist, il sera automatiquement chargé lors du prochain redémarrage. Cependant, vous pouvez également le charger manuellement avec:

 sudo launchctl load -w /Library/LaunchDaemons/vpn.connectscript.plist 

Notez que si votre script bash nécessite des autorisations root (p. Ex., Mon script qui modifie la table de routage), vous devez l'enregistrer dans /Library/LaunchDaemons/ (ou /System/Library/LaunchDaemons ). Si votre script doit être exécuté en tant qu'utilisateur normal, vous devez l'enregistrer dans ~/Library/LaunchAgents/ .

Si votre script s'exécute en tant que root et ne veut pas subir d'attaques d'escalade de privilège, le script bash qui s'appelle doit être dans un répertoire comme /opt/local/bin/ qui ne peut être modifié que par root. Si vous avez enregistré dans say ~/bin un utilisateur régulier pourrait modifier le script (ou renommer le fichier / répertoire et le remplacer par un fichier qu'ils ont écrit) et avoir un accès complet à votre système.

/etc/ppp/ip-up pour le script de pré-connexion, et /etc/ppp/ip-down pour le script post-connexion. N'oubliez pas d'ajouter un bit d'autorisation d'exécution. Je les utilise pour changer et restaurer la table de route avant et après les connexions PPTP et L2TP VPN.

Après avoir écrit le script nommé ip-up et ip-down , vous exécutez les commandes suivantes dans Terminal.app:

 chmod +x ip-up ip-down sudo cp ip-up ip-down /etc/ppp