Como você pode executar automaticamente um script depois de se conectar a uma VPN no OS X?

6

Configurei a conexão VPN no OS X 10.7.3, mas como a rede à qual estou me conectando usa um proxy corporativo, tem servidores de repositório Maven personalizados e outras configurações específicas de rede (unidades remotas, por exemplo), Eu quero executar um script no logon / logoff de uma VPN para:

  • altere o Maven ~/.m2/settings.xml para apontar para o seu repositório maven
  • mapeie alguns smb:// compartilhamentos,
  • alias alguns comandos para usar seus servidores

Eu não sei como fazer isso, no entanto.

  1. Como você executa um script ou conjunto de comandos automaticamente no logon ?
  2. Como você executa um script ou conjunto de comandos automaticamente no logoff ?
por Nick Klauer 20.02.2012 / 02:19

3 respostas

8

Se você já tem a VPN configurada, você pode se conectar a ela via linha de comando. Como expliquei nesta resposta , você pode criar duas funções de shell para login e logout, respectivamente, adicionando-as à sua ~/.bash_profile - veja a resposta vinculada para a função 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
}

Basta incluir os comandos personalizados necessários após o marcador EOF .

Se você quiser uma maneira de fazer GUI, abra Automator.app e crie um novo Aplicativo . Em seguida, arraste as ações para executar um script AppleScript e Shell no painel esquerdo e insira os comandos conforme mostrado abaixo.

Você pode então colocar esse pseudo-aplicativo em seu Dock para iniciá-lo rapidamente.

    
por 20.02.2012 / 13:47
8

Outra solução é usar um LaunchDaemon para monitorar um diretório específico e inicie um script externo sempre que o diretório tiver modificações. A Mac Developer Library fornece uma esboço de tal script (o exemplo deles monitora /etc/hostconfig e executa syslog -s -l notice "somebody touched /etc/hostconfig" sempre que o horário de modificação do arquivo é alterado.)

Para o nosso propósito, notamos que toda vez que você faz login em sua VPN, o diretório /Library/Preferences/SystemConfiguration é modificado. Então, se você salvar o seguinte arquivo plist dentro de /Library/LaunchDaemons/vpn.connectscript.plist , ele irá ver o diretório:

<?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>

Observe que este LaunchDaemon será chamado para mais do que apenas sua conexão VPN (por exemplo, toda vez que você se conectar a wifi). Portanto, seu script /opt/local/bin/vpn_some_script.sh deve ter uma verificação de que o encapsulamento está realmente conectado e o script não deve criar problemas se for executado várias vezes seguidas. (Então, se você montar compartilhamentos, você pode querer verificar se eles já não estão montados).

Por exemplo, meu script /opt/local/bin/vpn_some_script.sh é simplesmente:

#!/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

que só adiciona a rota a 10.0.0.0/8 através do túnel se eu estiver conectado ao túnel VPN (e mudo o padrão para ir ao roteador 192.168.1.1).

Quando você salva o arquivo plist, ele será automaticamente carregado na próxima reinicialização. No entanto, você também pode carregá-lo manualmente com:

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

Observe que, se o seu script bash precisar de permissões de root (por exemplo, meu script que altera a tabela de roteamento), será necessário armazená-lo em /Library/LaunchDaemons/ (ou /System/Library/LaunchDaemons ). Se o seu script deve ser executado como um usuário normal, você deve armazená-lo em ~/Library/LaunchAgents/ .

Se o seu script for executado como root e não quiser sofrer ataques de escalonamento de privilégios, o script bash que está sendo chamado deve estar em um diretório como /opt/local/bin/ que só pode ser modificado pelo root. Se você armazenou em dizer ~/bin um usuário regular poderia alterar o script (ou renomear o arquivo / diretório e substituí-lo por um arquivo que eles escreveram) e obter acesso total ao seu sistema.

    
por 07.04.2014 / 07:49
3

/etc/ppp/ip-up para o script de pré-conexão e /etc/ppp/ip-down para o script de pós-conexão. Não se esqueça de adicionar o bit de permissão de execução. Eu os uso para alterar e restaurar a tabela de rotas antes e depois das conexões VPN PPTP e L2TP.

Depois de escrever os dois scripts chamados ip-up e ip-down , você executa os seguintes comandos no Terminal.app:

chmod +x ip-up ip-down
sudo cp ip-up ip-down /etc/ppp
    
por 23.11.2015 / 09:00