Macに2つのVPN構成があり、マシンにsshしたときにコンソールからそれらを起動できるようにしたいと思います。
接続を構成できるコマンドnetworksetup
を見つけましたが、実際には接続を開始しないことがわかります。
Lionの使用。
新しいmacOSバージョンでは、以下の回答に示すように、非常に単純なコマンドを使用できます。 これ (+1してください!).
あなたに必要なのは:
networksetup -connectpppoeservice "UniVPN"
唯一の問題は、このコマンドを使用して切断できないことです。
AppleScriptを使用して、選択したVPNサービスに接続することもできます。読み込まれたら、コマンドラインから利用できるシェル関数を使用します。
以下の関数を~/.bash_profile
または~/.profile
(使用するもの)に追加します。
Network設定の下に表示されるように、VPN接続自体の名前を変更するだけです。ここでは大学のVPNを使用しました。
関数名を変更したい場合は、別の名前に変更することもできます。引数を使用してこれを短縮することは可能かもしれませんが、この方法でうまく機能します。私は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
}
また、少なくともライオンの時点で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
脚注:
これはLionでテストしていませんが、Mountain Lionで次のコマンドを問題なく使用しています。
networksetup -connectpppoeservice UniVPN
networksetup -connectpppoeservice "myvpn"
を使用してmyvpnという名前のvpnに接続し、networksetup -disconnectpppoeservice "myvpn"
を使用してmyvpnという名前のvpnから切断できます。
これらのコマンドラインを使用する前に、システム環境設定>ネットワークで接続を手動で構成する必要があります
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をテストしていません
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