web-dev-qa-db-ja.com

OS XでVPNに接続した後、スクリプトを自動的に実行するにはどうすればよいですか?

OS X 10.7.3でVPN接続を構成しましたが、接続先のネットワークは企業プロキシを使用し、カスタムMavenリポジトリサーバーとその他のネットワーク固有の設定(リモートドライブなど)を使用しているため、 VPNのログオン/ログオフ時にスクリプトを実行して次のことを行います。

  • mavenを変更する~/.m2/settings.xml彼らのMavenリポジトリを指す
  • いくつかの地図を作成するsmb://株、
  • サーバーを使用するためのいくつかのコマンドのエイリアス

しかし、これを達成する方法はわかりません。

  1. logonでスクリプトまたは一連のコマンドを自動的に実行するにはどうすればよいですか?
  2. logoffでスクリプトまたは一連のコマンドを自動的に実行するにはどうすればよいですか?
6
Nick Klauer

すでにVPNを構成している場合は、コマンドラインからVPNに接続できます。説明したように この回答では~/.bash_profileに追加することで、ログインとログアウト用にそれぞれ2つのシェル関数を作成できます– 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
}

EOFマーカーの後に必要なカスタムコマンドを含めるだけです。


GUIでそれを行う方法が必要な場合は、Automator.appを開き、新しいアプリケーション。次に、アクションをドラッグして左側のペインからAppleScriptおよびシェルスクリプトを実行し、以下に示すようにコマンドを挿入します。

次に、この疑似アプリケーションをDockに配置するだけで、すばやく起動できます。

8
slhck

別の解決策は、 LaunchDaemon を使用して特定のディレクトリを監視し、そのディレクトリに変更が加えられるたびに外部スクリプトを起動することです。 Mac Developer Libraryは そのようなスクリプトの概要 を提供します(それらの例は/etc/hostconfigを監視し、そのファイルの変更時間が変更されるたびにsyslog -s -l notice "somebody touched /etc/hostconfig"を実行します。)

私たちの目的のために、VPNにログインするたびに、ディレクトリ/Library/Preferences/SystemConfigurationが変更されることに注意してください。したがって、次のplistファイルを/Library/LaunchDaemons/vpn.connectscript.plist内に保存すると、そのディレクトリが監視されます。

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

このLaunchDaemonは、VPN接続以外にも呼び出されることに注意してください(たとえば、wifiに接続するたびに)。したがって、スクリプト/opt/local/bin/vpn_some_script.shは、トンネルが実際に接続されていることを確認する必要があり、スクリプトが連続して複数回実行されても問題が発生しないようにする必要があります。 (したがって、共有をマウントする場合は、それらがまだマウントされていないことを確認することをお勧めします)。

たとえば、私のスクリプト/opt/local/bin/vpn_some_script.shは単純に次のとおりです。

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

これは、VPNトンネルに接続している場合にのみ、トンネルを介して10.0.0.0/8にルートを追加します(デフォルトを変更して192.168.1.1ルーターに移動します)。

Plistファイルを保存すると、次回の再起動時に自動的にロードされます。ただし、次の方法で手動でロードすることもできます。

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

Bashスクリプトにroot権限が必要な場合(たとえば、ルーティングテーブルを変更する私のスクリプト)、それを/Library/LaunchDaemons/(または/System/Library/LaunchDaemons)に保存する必要があることに注意してください。スクリプトを通常のユーザーとして実行する必要がある場合は、~/Library/LaunchAgents/に保存する必要があります。

スクリプトがrootとして実行され、特権昇格攻撃を受けたくない場合、呼び出されるbashスクリプトは、rootによってのみ変更できる/opt/local/bin/のようなディレクトリにある必要があります。たとえば~/binに保存した場合、通常のユーザーがスクリプトを変更して(または、ファイル/ディレクトリの名前を変更して、自分が作成したファイルに置き換える)、システムへのフルアクセスを取得できます。

9
dr jimbob

接続前のスクリプトの場合は/etc/ppp/ip-up、接続後のスクリプトの場合は/etc/ppp/ip-down。実行許可ビットを追加することを忘れないでください。 PPTPおよびL2TPVPN接続の前後のルートテーブルの変更と復元に使用します。

ip-upip-downという名前の2つのスクリプトを作成したら、Terminal.appで次のコマンドを実行します。

chmod +x ip-up ip-down
Sudo cp ip-up ip-down /etc/ppp
4
Fish Monitor