コマンドライン(OSX)から構成済みVPNを開始します


48

Macに2つのVPN構成があり、マシンにsshするときにコンソールからそれらを起動できるようにしたいと思います。

networksetup接続を設定できるコマンドを見つけましたが、実際に接続を開始しないと言えます。

ライオンを使用します。


回答:


41

新しいmacOSバージョンでは、以下の回答に示すように、非常に単純なコマンドを使用できます。たとえば、これ(+1を指定してください!)

あなたが必要なのは:

 networksetup -connectpppoeservice "UniVPN"

唯一の問題は、このコマンドを使用して切断できないことです。


AppleScriptを使用して、選択したVPNサービスに接続することもできます。シェル関数を使用します。シェル関数は、読み込まれたらコマンドラインから使用できます。

以下に関数を(~/.bash_profileまたは~/.profile使用するものは何でも)追加します。

ネットワーク設定の下に表示されるように、VPN接続自体の名前を変更するだけです。ここで大学のVPNを使用しました。

ここに画像の説明を入力してください

別の関数に対して行う場合は、関数の名前も変更できます。引数を使用してこれを短縮することは可能かもしれませんが、この方法でうまく機能します。Snow Leopardでテストしました(ただし、LeopardとLionも動作するはずです)。

あなたが機能を追加したら、ターミナルをリロードしてそれらを呼び出すvpn-connectvpn-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
                repeat while (current configuration of VPN is not connected)
                    delay 1
                end repeat
        end tell
end tell
EOF
}

function vpn-disconnect {
/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 disconnect VPN
        end tell
end tell
return
EOF
}

boulder_rubyのコードのようにバックティックを挿入することで、この種の機能を得ました。しかし理想的には、戻る前にコールバックを待機します。私の目標は走ることvpn-connect && git fetch && vpn-disconnectです。これを行う方法があると思いますか?
マイケルフォレスト

良いアイデア。スクリプトを更新しました...テストしたところ、動作しているようです。
slhck

1
これは明らかかもしれませんが、記録のためだけです。実際にこれを機能させるには、GUIセッションを開く必要があるようです。私はそのマシン上のアクティブ同じユーザのGUIセッションがある間SSH経由でログインして呼び出すとvpn-connect、それは投げるんsyntax error: Expected end of line but found identifier. (-2741)が、AppleScriptのエディタを使用してアプリケーションにそれを変換し、呼び出した後にopen vpn-connect.appそれが動作します。ただし、そのユーザーのアクティブなGUIセッションがない場合、LSOpenURLsWithRole() failed with error -10810SSH経由で呼び出すとa がスローされます。
ステファンシュミット

56

また、少なくともLion 1では、scutilコマンドを使用できます。

たとえば、「Foo」という名前のVPNサービスがある場合、次の方法で接続できます。

$ scutil --nc start Foo

オプションで、同じ名前のフラグを使用してユーザー、パスワード、およびシークレットを指定できます。

$ scutil --nc start Foo --user bar --password baz --secret quux

サービスは次の方法で切断できます。

$ scutil --nc stop Foo

詳細なヘルプについては、manページを参照するか、次を実行してください

$ scutil --nc help

更新

接続が確立されるまでポーリングする簡単なスクリプトを追加します(Eric Bからのコメントへの応答で)

#!/bin/bash

# Call with <script> "<VPN Connection Name>"

set -e
#set -x

vpn="$1"

function isnt_connected () {
    scutil --nc status "$vpn" | sed -n 1p | grep -qv Connected
}

function poll_until_connected () {
    let loops=0 || true
    let max_loops=200 # 200 * 0.1 is 20 seconds. Bash doesn't support floats

    while isnt_connected "$vpn"; do
        sleep 0.1 # can't use a variable here, bash doesn't have floats
        let loops=$loops+1
        [ $loops -gt $max_loops ] && break
    done

    [ $loops -le $max_loops ]
}

scutil --nc start "$vpn"

if poll_until_connected "$vpn"; then
    echo "Connected to $vpn!"
    exit 0
else
    echo "I'm too impatient!"
    scutil --nc stop "$vpn"
    exit 1
fi

脚注:

  1. このコマンドがOSXに追加された時期は明らかではありません。私はMavericksでそれを所有しています。ユーザーEric B.は、Lion(10.7.5)で機能すると報告しています。

Lion(10.7.5)でこれを試してみたところ、うまくいきました。マニュアルページには記載されていません。ありがとう!
エリックB。

接続が完了するまで戻ってからscutilを取得するための待機はありますか?接続が確立されたらスクリプトを実行する必要がありますが、scutilの戻りが速すぎて、接続が確立される前に次のコマンドが実行されます。
エリックB. 14

@EricB。簡単なスクリプトについては、更新を参照してください。
エンコード

ユーザー名オプションは--user--username
Rockallite

2
scutil --nc stop Foo(ヨセミテで)動作しない理由はありますか?
fdot

26

Lionではこれをテストしていませんが、Mountain Lionでは問題なく次のコマンドを使用しています。

networksetup -connectpppoeservice UniVPN

これは、このユーティリティが'02に追加されたときに機能するはずです。
エルデベロッパー

2
はい、驚くことに、このアプローチはスイッチがVPNサービス用ではなくPPPoEサービス用であっても機能しますが、切断はこの方法では機能しません。
ステファンシュミット

これは、L2TPに保存された共有シークレットで機能しますscutilが、機能しません!
コンスタンチンスボー

これは完全に機能しscutilます。保存されたデータをまったく使用しないためです。
マットフレッチャー

OS X 10.13.5で私のために働いた!!
User7391

0

slhck(明らかに黄金の神)による上記のスクリプトを使用して、あらゆる種類の物に使用できるこの気の利いたルビースクリプトを作成しました。

class SwitchIp

def go
  turn_off
  sleep 3
  turn_on
end

def turn_on
  `/usr/bin/env osascript <<-EOF
      tell application "System Events"
        tell current location of network preferences
            set VPN to service "StrongVPN" -- your VPN name here
            if exists VPN then connect VPN
      end tell
    end tell
  EOF` 
end

def turn_off
  `/usr/bin/env osascript <<-EOF
    tell application "System Events"
      tell current location of network preferences
            set VPN to service "StrongVPN" -- your VPN name here
            if exists VPN then disconnect VPN
      end tell
  end tell
 EOF`
end

end

0

を使用networksetup -connectpppoeservice "myvpn"してmyvpnという名前のVPNに接続し、myvpnという名前のVPN networksetup -disconnectpppoeservice "myvpn"から切断することができます。

これらのコマンドラインを使用する前に、[システム環境設定]> [ネットワーク]で接続を手動で構成する必要があります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.