web-dev-qa-db-ja.com

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

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

接続を構成できるコマンドnetworksetupを見つけましたが、実際には接続を開始しないことがわかります。

Lionの使用。

50
Ketema

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

あなたに必要なのは:

 networksetup -connectpppoeservice "UniVPN"

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


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

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

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

enter image description here

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

関数を追加したら、ターミナルをリロードして、それぞれvpn-connectおよび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
                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
}
47
slhck

また、少なくともライオンの時点で1、scutilコマンドを使用します。

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

$ scutil --nc start Foo

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

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

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

$ scutil --nc stop Foo

詳細なヘルプが必要な場合は、 man page を参照するか、次を実行してください。

$ 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)で動作することを報告しています。
58
encoded

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

networksetup -connectpppoeservice UniVPN
27
pierre-o

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

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

0
Feng Liu

MacOS 10.14.5 Mojaveで動作します:

Connect VPN:Use @ slhck's answer -> networksetup -connectpppoeservice "VPN Name"

VPNを切断します:From @ encoded's answer -> scutil --nc stop "VPN Name"

これは、L2TP over IPSEC VPNで機能しました。 Cisco IPSECまたはIKEv2 VPNをテストしていません

0
Eric Nelson

Slhck(明らかに黄金の神)によって上記のスクリプトを使用して、この気の利いたRubyスクリプトをあらゆる種類のものに使用できるように作成しました

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
boulder_ruby